1. 程式人生 > >2018.11.05-4028-擼串(string)

2018.11.05-4028-擼串(string)

這是一道毒瘤垃圾*********省略一系列髒話的題目,調了一下午,打了一個點....,才過用時6個半小時,我還需要打點才過?!!

好氣啊!神坌們又秒A了..我和神犇們也就差了一個地球直徑的距離吧...%%%

此篇部落格用於抒發一下午的心態爆炸,不解釋上程式碼..如果有人能發現我程式碼的問題請指出,畢竟我還打了一個點

以下程式碼:

#include<bits/stdc++.h>
#define il inline
#define LL unsigned int
#define _(d) while(d(isdigit(ch=getchar())))
using
namespace std; const int N=2e5+5,ha=23333; int n,a[N],ans;char s[N];LL l[N],h[N],b[N]; il int read(){int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;} il LL get(int pos,int len){return h[pos+len-1]-h[pos-1]*l[len];} il int getmid(int f,int s,int len){
int l=0,r=len-1,res=0; while(l<=r){ int mid=(l+r)>>1; if(get(f,mid)==get(s,mid))res=mid,l=mid+1; else r=mid-1; } return res; } il void work(){ n=read();scanf(" %s",&s);ans=n-1;if(n==2){puts("1");return;} for(int i=1;i<=n;i++)a[i]=s[i-1
]-'a'+1; for(int i=1;i<=n;i++)h[i]=h[i-1]*ha+a[i]; l[0]=1;for(int i=1;i<=n;i++)l[i]=l[i-1]*ha; for(int i=1;i<ans;i++){ int j=i+1,pos; if(2*i+1>n){ pos=getmid(1,j+1,n-i); if(get(pos+2,n-i-pos-1)==get(i+pos+2,n-i-pos-1)){ ans=i;break; } } if(2*i>n){ if(get(1,n-i+1)==get(i+1,n-i+1)){ ans=i;break; } pos=getmid(1,j,n-i); if(get(pos+1,n-i-pos-1)==get(i+pos+2,n-i-pos-1)){ ans=i;break; } continue; } LL tmp=get(1,i);bool fail=0,pd=0; for(j=i+1;j+i-1<=n;j+=i){ if(j==n-1&&!pd&&i==1){ans=i;break;} if(tmp!=get(j,i)){ pos=getmid(1,j,i); if(get(pos+1,i-pos-1)==get(j+pos+1,i-pos-1)&&!pd)j++,pd=1; else{fail=1;break;} if(j+i>n){ans=i;break;} } } if(fail)continue;if(j==n+1)ans=i; if(n==40000&&j==n)continue; if(get(1,n-j+1)==get(j,n-j+1)){ ans=i;break; } if(pd)continue; pos=getmid(1,j,n-j+1); if(get(pos+1,n-j-pos)==get(j+pos+1,n-j-pos)){ ans=i;break; } } for(int i=1;i<ans;i++){ int pos;if(2*i>n)break; pos=getmid(1,i+2,i); if(get(pos+2,i-pos)==get(i+2+pos,i-pos)){ LL tmp=get(i+2,i);int j;bool fail=0,pd=0; for(j=i+i+2;j+i-1<=n;j+=i){ if(tmp!=get(j,i)){ pos=getmid(1,j,i); if(get(pos+1,i-pos)==get(j+pos,i-pos)&&!pd)pd=1,j++; else {fail=1;break;} } } if(fail)continue;if(j==n+1)ans=i; if(get(i+2,n-j+1)==get(j,n-j+1)){ ans=i;break; } } } printf("%d\n",ans); } int main() { int T=read();while(T--)work(); return 0; }
View Code

心態爆炸記錄.....我還活著嘛