字符串哈希。
应该算第一次接触这种方法吧。
在长串的头和尾搜索,把当前位置构成的字串哈希成一个值。判断头尾这个值是否相等。如果相等,那么最后的回文字串的长度一定要+2.最后判断奇数情况时,加上最中间的一个。
#include <stdio.h>
#include <string.h>
#define N 50005
#define SEED 31
char s[N];
int has[N];
int main()
{
int t;
scanf("%d",&t);
int i=1;
while(i<=t)
{
scanf("%s",s);
has[0]=1;
for(int i=1;i<=50000;i++)
has[i]=has[i-1]*SEED;
int l=strlen(s);
int head=0,tail=0,pos=0,ans=0;
for(int i=0;i<l/2;i++)
{
head*=SEED;
head+=(s[i]-'A'+1);
tail+=(s[l-i-1]-'A'+1)*has[i-pos];
if(head==tail)
{
ans+=2;
pos=i+1;
head=0;
tail=0;
}
}
if(head!=0)
ans++;
if(l%2==1&&head==0)
ans++;
printf("Case #%d: %d\n",i++,ans);
}
return 0;
}
本文介绍了一种利用字符串哈希的方法来寻找最长回文子串的算法实现过程。通过将字符串两端的子串进行哈希并比较其值,可以快速判断回文特性,特别适用于长字符串的处理。
470

被折叠的 条评论
为什么被折叠?



