rt,没脑子直接莽了,赛后感觉时间复杂度有点危险。
云斗最大不到 600,洛谷最大 660,是不是没跑满。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
template<class T=int>
T read(){
char c;bool flag=0;
while(c=getchar(),c<'0'||c>'9') if(c=='-') flag=1;
T x=c^'0';
while(c=getchar(),c>='0'&&c<='9') x=x*10+(c^'0');
return flag?-x:x;
}
const int N=3000;
int n,m,x[N+5];
char a[N+5][N+5],b[N+5][N+5];
const ull p=13331;
ull ahas[N+5][N+5],bhas[N+5][N+5];
void build(char c[],ull has[]){
for(int i=1;i<=m;++i) has[i]=has[i-1]*p+(c[i]-'a'+1);
}
int main(){
freopen("dict.in","r",stdin);
freopen("dict.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;++i){
scanf("%s",a[i]+1);
memcpy(b[i]+1,a[i]+1,sizeof(char)*m);
sort(a[i]+1,a[i]+1+m),sort(b[i]+1,b[i]+1+m,greater<char>());
build(a[i],ahas[i]),build(b[i],bhas[i]);
}
for(int i=1;i<=n;++i){
bool flag=1;
for(int j=1;j<=n;++j) if(i!=j){
int l=0,r=m+1;
while(l+1<r){
int mid=(l+r)>>1;
if(ahas[i][mid]==bhas[j][mid]) l=mid;
else r=mid;
}
if(l==m||a[i][l+1]>b[j][l+1]){
flag=0;
break;
}
}
putchar(flag+'0');
}
}