zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    }
    int main()
    {
        int T=read();while(T--)work();
      return 0;
    }
    View Code

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

  • 相关阅读:
    ffmpeg常用命令集合
    Django传文件(FILES用法)
    Flask传文件(files用法)
    docker 部署redis服务
    tomcat启动报错ContainerBase.addChild: start
    Echarts折线图 y轴刻度数值与实际值不符解决方法
    春招日记
    Leetcode5700. 使所有区间的异或结果为零(DP)
    VS2015拖动调整代码窗口奔溃
    图床搭建
  • 原文地址:https://www.cnblogs.com/Jessie-/p/9925438.html
Copyright © 2011-2022 走看看