【YBTOJ】迴文子串
阿新 • • 發佈:2021-01-27
思路:
首先我們把字串存到hash陣列當中,然後思考怎樣判斷
我們可以列舉中心位置,然後二分長度,用字串hash判斷是否對稱就行
注意要判斷長度奇偶
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[1000100];
unsigned long long up[1000100], down[1000100], f[1000100];
int main()
{
scanf("%s", s+ 1);
int n=strlen(s+1);
int m=0;
while(s[1]!='E'||s[2]!='N'||s[3]!='D')
{
f[0]=1;
for(int i=1; i<=n; i++)
{
f[i]=f[i-1]*131ull;
up[i]=up[i-1]*131ull+s[i]-'a';
}
down[n+1]=0;
for(int i=n; i>=1; i--)
down[i]=down[i+1]*131ull+s[i]-'a';
int ans=0;
for(int i=1; i<=n; i++)
{
int l=0, r=n;
while(l<=r)
{
int mid=l+r>>1;
if(i-mid<1||i+mid>n)
r=mid-1;
else
if(up[i]-up[i-mid-1]*f[mid+1]==down[i]-down[i+mid+1]*f[mid+1])
ans=max(ans, mid*2+1), l=mid+1;
else
r=mid-1;
}
l=0, r=n;
while(l<=r)
{
int mid= l+r>>1;
if(i-mid<0||i+mid>n)
r=mid-1;
else
if(up[i]-up[i-mid]*f[mid]==down[i+1]-down[i+mid+1]*f[mid])
ans=max(ans, mid*2), l=mid+1;
else
r=mid-1;
}
}
m++;
printf("Case %d: %d\n", m, ans);
memset(down, 0, sizeof(down));
scanf("%s", s+1);
n=strlen(s+1);
}
return 0;
}
/*abcbabcbabcba*/