NOIP2023T1二分加哈希不会寄吧
  • 板块学术版
  • 楼主jr_linys
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/11/18 21:17
  • 上次更新2023/11/18 22:16:45
查看原帖
NOIP2023T1二分加哈希不会寄吧
667763
jr_linys楼主2023/11/18 21:17

rt,没脑子直接莽了,赛后感觉时间复杂度有点危险。

云斗最大不到 600600,洛谷最大 660660,是不是没跑满。

#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');
	}
}
2023/11/18 21:17
加载中...