1 条题解

  • 2
    @ 2021-8-7 20:42:44

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ull unsigned long long
    using namespace std;
    
    const int N=1e6+10;
    const int base=131;
    
    char str[2*N];
    ull hl[2*N],hr[2*N],p[2*N];
    
    ull get(ull h[],int l,int r)
    {
        return h[r]-h[l-1]*p[r-l+1];
    }
    
    int main()
    {
        int T=1;
        while(~scanf("%s",str+1),strcmp("END",str+1))
        {
            ///添加'{'符号
            int n=strlen(str+1);
            for(int i=2*n;i;i-=2)
            {
                str[i]=str[i/2];
                str[i-1]='z'+1;
            }
            ///长度增大
            n*=2;
    
            p[0]=1;
            for(int i=1,j=n;i<=n;i++,j--)
            {
                hl[i]=hl[i-1]*base+str[i]-'a'+1;
                hr[i]=hr[i-1]*base+str[j]-'a'+1;
                p[i]=p[i-1]*base;
            }
    
            int res=0;
            for(int i=1;i<=n;i++)
            {
                int l=0,r=min(i-1,n-i);
                while(l<r)
                {
                    int mid=l+r+1>>1;
                    ///hl左端点i-mid,右端点i-1;hr左端点要翻转
                    if(get(hl,i-mid,i-1)!=get(hr,n-(i+mid)+1,n-(i+1)+1)) r=mid-1;
                    else l=mid; ///mid=l+r+1>>1
                }
    
                ///字母多一个,回文半径是l,总长度为2l+1
                if(str[i-l]<='z') res=max(res,(2*l+1)/2+1);///上取整
                else res=max(res,l);
            }
    
            printf("Case %d: %d\n",T++,res);
        }
    
        return 0;
    
    }
    
    • 1

    信息

    ID
    50
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    54
    已通过
    51
    上传者