zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    STL容器 erase的使用陷井
    转:VC++线程同步-事件对象
    VC线程同步方法
    C/C++四种退出线程的方法
    rabbitMQ 常用命令
    Spring @Configuration
    Spring RabbitMQ 延迟队列
    rabbitmq web管理界面 用户管理
    Linux下tar.gz 安装
    Linux下RPM软件包的安装及卸载
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6571637.html
Copyright © 2011-2022 走看看