zoukankan      html  css  js  c++  java
  • manacher

    先放下代码:

    时间2018-4-9-19-58

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<cstdlib>
    #define N 2010000
    #define INF 0x3f3f3f3f
    #define MOD 10000
    using namespace std;
    char s[N],t[N];
    int p[N];
    void Preprocess(char* s)
    {
        int s_len,cnt=0;
        s_len=strlen(s);
        t[cnt++]='$';
        for(int i=0; i<s_len; i++)
        {
            t[cnt++]='#';
            t[cnt++]=s[i];
        }//对s的处理变为t
        t[cnt++]='#';
        t[cnt++]='';
    }
    int manacher(char* t)
    {
        int t_len,C,R,ans;
        t_len=strlen(t);
        p[0]=0,C=0,R=0;
        for(int i=1; i<t_len-1; i++) //求没一点为中心的最长回文串的半径
        {
            if(i<R)//利用回文特性
            {
                int j=2*C-i;
                p[i]=min(p[j],R-i);
                while(t[i+p[i]+1]==t[i-p[i]-1])
                        p[i]++;
                if(p[i]+i>=R)
                {
                    C=i;
                    R=p[i]+i;
                }
            }
            else//不能利用回文的特性
            {
    
                p[i]=0;
                while(t[i+p[i]+1]==t[i-p[i]-1])
                    p[i]++;
                C=i;
                R=i+p[i];
            }
        }
        ans=-1;
        for(int i=1; i<t_len-1; i++)
        {
            ans=ans>p[i]?ans:p[i];
        }
        return ans;
    }
    int main()
    {
        int k=0;
        while(~scanf("%s",s))
        {
            if(!strcmp(s,"END"))
            {
                return 0;
            }
            Preprocess(s);
            printf("Case %d: %d
    ",++k,manacher(t));
        }
        return 0;
    }
  • 相关阅读:
    C#反射
    做下一周计划
    OFFSET 函数
    微信跳一跳学习笔记
    跳一跳脚本代码搬运
    预测羽毛球赛成绩学习笔记
    将Python123中作业成绩绘制成雷达图
    Matplotlib库
    Numpy库
    第四周作业
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/9780069.html
Copyright © 2011-2022 走看看