51nod 1089 最长回文子串 V2(Manacher算法)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。
 
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
Output
共T行,输出对应的阶乘的长度。
Input示例
3
4
5
6
Output示例
2
3
3

初次用hash求回文串 。
屠龙宝刀点击就送
#include <cstring>
#include <cstdio>
#define Maxl 1000000
#define max(a,b) a>b?a:b

char str1[Maxl*2];
int str2[Maxl*4],i,wz,hash_l[Maxl*2],hash_r[Maxl*2],p=29,pow[Maxl*2]={1};

void hash()
{
    for(i=1;i<=wz;++i)
    pow[i]=pow[i-1]*p;
    for(i=wz;i>=1;--i)
    hash_l[i]=hash_l[i+1]*p+str2[i];
    for(i=1;i<=wz;++i)
    hash_r[i]=hash_r[i-1]*p+str2[i];
}
int main()
{
    scanf("%s",str1);
    int len=strlen(str1);
    for(i=0;i<len;++i)
    {
        str2[++wz]='#';
        str2[++wz]=str1[i]-'A';
    }
    str2[++wz]='#';
    hash();
    int l,r,mid,ans=0;
    for(i=1;i<=wz;++i)
    {
        l=0;
        if(i-1<wz-i) r=i;
        else r=wz-i+1;
        while(l<r-1)
        {
            int mid=(l+r)>>1;
            if(hash_r[i-1]-hash_r[i-mid-1]*pow[mid]==hash_l[i+1]-hash_l[i+mid+1]*pow[mid]) l=mid;
            else r=mid;
        }
        ans=max(ans,l);
    }
    printf("%d",ans);
    return 0;
}

 


posted @ 2017-03-18 09:59  杀猪状元  阅读(227)  评论(0编辑  收藏  举报