HASH求调
查看原帖
HASH求调
820227
Super_Builder楼主2024/1/24 16:24
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD=998244353;
const int p=13331;
int n,f[2000005],qpw[2000005];
string s;
int get_hash(int l,int r){
	if(l>r)return 0;
	return (f[r]-f[l-1]*qpw[r-l+1]%MOD+MOD)%MOD;
}
map<int,bool>mp; 
signed main(){
	cin>>n;
	cin>>s;
	if(n%2==0)return puts("NOT POSSIBLE"),0;
	s=" "+s;
	qpw[0]=1;
	for(int i=1;i<=n;i++){
		f[i]=(f[i-1]*p%MOD+s[i])%MOD;
		qpw[i]=qpw[i-1]*p%MOD;
	}
	int len=n/2,cnt=0;
	int ans=0;
	for(int i=1;i<=n;i++){
		int x,y,a,b;
		x=a=b=y=0;
		if(i==n){
			x=get_hash(1,len);
			y=0;
			a=get_hash(len+1,i-1);
		}
		else if(i==len+1){
			x=get_hash(1,len);
			a=get_hash(i+1,n);
		}
		else if(i>len){
			x=get_hash(1,len);
			y=0;
			a=get_hash(len+1,i-1)*qpw[len-n+i-1]%MOD;
			b=get_hash(i+1,n);
		}
		else{
			x=get_hash(1,i-1)*qpw[len-i+1]%MOD;
			y=get_hash(i+1,len+1)%MOD;
			a=get_hash(len+2,n)%MOD;
			b=0;
		}
		if(x+y==a+b){
			if(cnt==0){
				ans=i;
				cnt++;
				mp[x+y]=1;
			}
			else if(!mp[x+y])return puts("NOT UNIQUE"),0;
		}
	}
	if(!cnt)puts("NOT POSSIBLE");
	else {
		if(ans>len){
			cout<<s.substr(1,len);
		}
		else {
			cout<<s.substr(len+2);
		}
	}
	return 0;
}
2024/1/24 16:24
加载中...