BZOJ3916 [Baltic2014]friends

来源:互联网 发布:旅游点评网站源码 编辑:程序博客网 时间:2024/06/03 17:17

枚举U的位置,hash判断即可

这个玩意特别的蛋疼……不唯一解指的是答案的字符串不一样,要是可以从两个位置拆开但是是俩一样的字符串的话不算不唯一解-_-

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 4000010#define MAXM 1010#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longint n;char s[MAXN];ll h[MAXN],mi[MAXN];ll bas=233;int ans;ll ansh;int main(){int i;scanf("%d%s",&n,s+1);if(!(n&1)){printf("NOT POSSIBLE\n");return 0;}mi[0]=1;for(i=1;i<=n;i++){mi[i]=mi[i-1]*bas%MOD;h[i]=(h[i-1]*bas+s[i])%MOD;}for(i=1;i<=n/2+1;i++){if((h[n/2+1]-h[i]*mi[n/2+1-i]%MOD+h[i-1]*mi[n/2+1-i]%MOD+MOD)%MOD  ==  (h[n]-h[n/2+1]*mi[n-n/2-1]%MOD+MOD)%MOD){if(ans&&ansh!=(h[n]-h[n/2+1]*mi[n-n/2-1]%MOD+MOD)%MOD){printf("NOT UNIQUE\n");return 0;}ans=i;ansh=(h[n]-h[n/2+1]*mi[n-n/2-1]%MOD+MOD)%MOD;}}for(;i<=n;i++){if(((h[n]-h[i]*mi[n-i]%MOD+MOD)+(h[i-1]-h[n/2]*mi[i-1-n/2]%MOD+MOD)%MOD*mi[n-i]%MOD)%MOD==h[n/2]){if(ans&&ansh!=h[n/2]){printf("NOT UNIQUE\n");return 0;}ans=i;ansh=h[n/2];}}if(!ans){printf("NOT POSSIBLE\n");return 0;}for(i=1;i<=n/2+(ans<=n/2);i++){if(i!=ans){printf("%c",s[i]);}}printf("\n");return 0;}/*3TTT*/


0 0