几个小点WA求助
查看原帖
几个小点WA求助
1432013
DashZhanghanxu楼主2025/6/23 22:20

WA全部是 NOT ... 判断错误,hash,get全部正确

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define O2 ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N=1e6*2+10;
int P=131;
int n;
string s;
int start,endd;
int Hash[N];
int p[N];
int mid;
string sub[N];
unordered_map<int,int>vis;
int get1(int l,int r){
	return Hash[r]-Hash[l-1]*p[r-l+1];//abc
}
int get2(int l,int r,int b){
	return get1(l,b-1)*p[r-b]+get1(b+1,r); //abcabxc
}
signed main(){
    O2;
    cin>>n>>s;
    p[0]=1;
    for(int i=1;i<=n;i++){
    	p[i]=p[i-1]*P;
	}
	if(n%2==0){
		cout<<"NOT POSSIBLE";
		return 0;
	}
	for(int i=0;i<n;i++){
		Hash[i+1]=Hash[i]*P+s[i];
	}
	mid=(n+1)/2;
	int flag=0;
	int k1=get1(mid+1,n),k2=get1(1,mid-1);
	if(get1(2,mid)==get1(1+mid,n)){
		start=1,endd=mid-1;
		vis[start]++;
		flag=1;
	}
	if(get1(1,mid-1)==get1(mid,n-1)){
		if(flag==1&&vis[start]==0){
			cout<<"NOT UNIQUE";
			return 0; 
		}
		start=0,endd=mid-1;
		vis[start]++;
		flag=1;
	}
    for(int i=2;i<n;i++){
    	if(i<mid){
    		if(get2(0,mid,i)==k1){
    			if(flag==0){
				flag=1;
				start=mid,endd=n-mid;
				vis[start]=1;
    			}else if(vis[start]==0){
    				cout<<"NOT UNIQUE";
    				return 0;
				}
			}
		}else if(i>mid){
			if(get2(mid,n,i)==k2){
    			if(flag==0){
				flag=1;
				start=0,endd=mid-1;
				vis[start]=1;
			}else if(vis[start]==0){
    				cout<<"NOT UNIQUE";
    				return 0;
				}
			}
		}else{
			if(get1(1,i-1)==get1(i+1,n)){
				start=0,endd=i-1;
				flag=1;
				vis[start]=1;
			}
		}
	}
	if(flag){
		cout<<s.substr(start,endd);
	}else{
		cout<<"NOT POSSIBLE";
	}
    return 0;
}

2025/6/23 22:20
加载中...