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

心态爆炸记录.....我还活着嘛

 

posted @ 2018-11-07 20:26  Jessiejzy  阅读(176)  评论(0编辑  收藏  举报