UVALive 6439 Pasti Pas!

来源:互联网 发布:怎样复制淘宝链接 编辑:程序博客网 时间:2024/05/21 09:12

点击打开题目链接

字符串哈希。

应该算第一次接触这种方法吧。

在长串的头和尾搜索,把当前位置构成的字串哈希成一个值。判断头尾这个值是否相等。如果相等,那么最后的回文字串的长度一定要+2.最后判断奇数情况时,加上最中间的一个。


#include <stdio.h>#include <string.h>#define N 50005#define SEED 31char 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;}

0 0
原创粉丝点击