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;
    }
  • 相关阅读:
    jsp四个域对象
    java,qq邮箱发邮件工具类(需要部分修改)
    Java使用qq邮箱发邮件实现
    JavaScript 高级
    JavaScript基础
    JQuery 高级
    JQuery 基础
    团队最后一次作业:总结
    C++多态
    结对编程
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/9780069.html
Copyright © 2011-2022 走看看