1 条题解
-
2赵青海 (huhe) LV 7 SU @ 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
- 上传者