zoukankan      html  css  js  c++  java
  • 马拉车模板

    Input
    输入Str(Str的长度 <= 1000)
    Output
    输出最长回文子串的长度L。
    Input示例
    daabaac
    Output示例
    5

    【模板】
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    using namespace std;  
    char ch[100100];  
    char T[200200];  
    int P[200200];  
    int main()  
    {  
        scanf("%s",ch);  
        int ll=strlen(ch);  
        memset(T,0,sizeof(T));  
        T[0]=1;  
        for (int i=0;i<=ll;i++)  
        {  
            T[2*i+1]='#';  
            T[2*i+2]=ch[i];  
        }  
        ll=2*ll+2;  
        int ss=0,ans=0,mid;  
        for (int i=1;i<=ll;i++)  
        {  
            if (ss>i)  
            P[i]=min(P[2*mid-i],ss-i+1);  
            else  
            P[i]=1;  
            while (T[i+P[i]]==T[i-P[i]])  
            P[i]++;  
            if (ss<P[i]+i-1)  
            {  
                mid=i;  
                ss=P[i]+i-1;  
            }  
            ans=max(ans,P[i]-1);  
        }  
        printf("%d
    ",ans);  
        return 0;  
    }  
    malache算法
    const int maxn=1000010;  
    char str[maxn];//原字符串  
    char tmp[maxn<<1];//转换后的字符串  
    int Len[maxn<<1];  
    //转换原始串  
    int INIT(char *st)  
    {  
        int i,len=strlen(st);  
        tmp[0]='@';//字符串开头增加一个特殊字符,防止越界  
        for(i=1;i<=2*len;i+=2)  
        {  
            tmp[i]='#';  
            tmp[i+1]=st[i/2];  
        }  
        tmp[2*len+1]='#';  
        tmp[2*len+2]='$';//字符串结尾加一个字符,防止越界  
        tmp[2*len+3]=0;  
        return 2*len+1;//返回转换字符串的长度  
    }  
    //Manacher算法计算过程  
    int MANACHER(char *st,int len)  
    {  
         int mx=0,ans=0,po=0;//mx即为当前计算回文串最右边字符的最大值  
         for(int i=1;i<=len;i++)  
         {  
             if(mx>i)  
             Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取个小  
             else  
             Len[i]=1;//如果i>=mx,要从头开始匹配  
             while(st[i-Len[i]]==st[i+Len[i]])  
             Len[i]++;  
             if(Len[i]+i>mx)//若新计算的回文串右端点位置大于mx,要更新po和mx的值  
             {  
                 mx=Len[i]+i;  
                 po=i;  
             }  
             ans=max(ans,Len[i]);  
         }  
         return ans-1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度   
      }  
    有注释版
  • 相关阅读:
    JS和C# 里的闭包及闭包在事件中的使用
    ***项目开发记录
    七牛云存储之应用视频上传系统开心得
    二维码及二维码接合短URL的应用
    EF批量添加,删除,修改的扩展
    ngTemplateOutlet递归的问题
    每日新知2019-06-03
    Spring boot初始
    纯前端播放本地音乐
    macbook 安装任意来源
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7624340.html
Copyright © 2011-2022 走看看