1 条题解
-
1
#include <bits/stdc++.h> using namespace std; #define ull unsigned long long #define Mod 131 //P进制 const int N=1000007; char s[N]; ull f1[N],f2[N],p[N]; int ans,t,l,r,mid; ull Hash1(int i,int j){//正字符串的哈希值 return (f1[j]-f1[i-1]*p[j-i+1]); } ull Hash2(int i,int j){//反字符串的哈希值 return (f2[i]-f2[j+1]*p[j-i+1]); } void init(){ p[0]=1;//p^0为1 for(int i=1;i<=N-1;i++) p[i]=p[i-1]*131;//P进制的位值 } int main(){ init(); while (++t){ ans=0; scanf("%s",s+1); int len=strlen(s+1); if (strcmp(s+1,"END")==0) //结束读入 return 0; f2[len+1]=0;//初始化要注意 for(int i=1;i<=len;i++) f1[i]=f1[i-1]*Mod+(s[i]-'a'+1);//前缀和 for(int i=len;i>=1;i--) f2[i]=f2[i+1]*Mod+(s[i]-'a'+1);//后缀和 for(int i=1;i<=len;i++) { l=0,r=min(i-1,len-i);//二分枚举长度为奇数的字符串 记住这里l一定要为0 while(l<r){ mid=l+r+1>>1; if (Hash1(i-mid,i-1)==Hash2(i+1,i+mid))//如果这是一个回文串的话 l=mid; else r=mid-1; } ans=max(l<<1 | 1,ans);//算出最大长度 l=0,r=min(i-1,len-i+1);//偶数字符串 while (l<r){ mid=l+r+1>>1; if (Hash1(i-mid,i-1)==Hash2(i,i+mid-1))//check判断 l=mid; else r=mid-1; } ans=max(l<<1,ans);//偶数字符串只需要*2 } printf("Case %d: %d\n",t,ans); } return 0; }
- 1
信息
- ID
- 239
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 37
- 已通过
- 28
- 上传者