美文网首页
后缀数组_最长回文

后缀数组_最长回文

作者: Gitfan | 来源:发表于2017-03-11 16:30 被阅读0次

给定一个字符串,求最长回文子串。
算法分析:
穷举每一位,然后计算以这个字符为中心的最长回文子串。注意这里要分两
种情况,一是回文子串的长度为奇数,二是长度为偶数。两种情况都可以转化为
求一个后缀和一个反过来写的后缀的最长公共前缀。具体的做法是:将整个字符
串反过来写在原字符串后面,中间用一个特殊的字符隔开。这样就把问题变为了
求这个新的字符串的某两个后缀的最长公共前缀
这个做法的时间复杂度为 O(nlogn)

题目:scut oj 2505

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 400010
using namespace std;
char cpy[200010];
char s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn],Rank[maxn],height[maxn],n;
void build_sa(int m){
    int i,*x=t,*y=t2,*T,p ;
    n++;
    for(i=0;i<m;++i)c[i]=0;
    for(i=0;i<n;++i)++c[x[i]=s[i]];
    for(i=1;i<m;++i)c[i]+=c[i-1];
    for(i=n-1;i>=0;--i)sa[--c[x[i]]]=i;
    for(int k=1;k<=n;k<<=1)
    {
          p=0;
       for(i=n-1;i>=n-k;--i)y[p++]=i;
       for(i=0;i<n;++i)if(sa[i]>=k)y[p++]=sa[i]-k;
       for(i=0;i<m;++i)c[i]=0;
       for(i=0;i<n;++i)++c[x[y[i]]];
       for(i=1;i<m;++i)c[i]+=c[i-1];
       for(i=n-1;i>=0;--i)sa[--c[x[y[i]]]]=y[i];
       swap(x,y);
       x[sa[0]]=0;p=1;
       for(i=1;i<n;++i)
         x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
       if(p>=n)break;
       m=p;
    }
    n--;
   // for(int i=1;i<=n;++i)printf("%d ",sa[i]+1);
    //printf("\n");

}
void cal_height(){
    int i,j,k=0;
    for(i=1;i<=n;i++)Rank[sa[i]]=i;
    for(int i=0;i<n;++i)
    {
       j=sa[Rank[i]-1];//h[i-1]
       if(k)k--;
       while(s[i+k]==s[j+k])k++;
       height[Rank[i]]=k;//h[i]
    }
    //for(int i=2;i<=n;++i)printf("%d ",height[i]);
}
int solve()
{
    int sum=0,i;
    for(i=2;i<=n;i++)
    {
        sum=height[i]>sum?height[i]:sum;
    }
    return sum;

}
int main(){
    while(scanf("%s",cpy)!=EOF)
    {
        n=strlen(cpy);
        strcpy(s,cpy);
        s[n]='$';
        for(int i=n-1,j=n+1;i>=0;i--,j++)
        {
            s[j]=cpy[i];
        }
        n=2*n+1;
        build_sa(255);
        cal_height();
        printf("%d\n",solve());
    }
}

相关文章

  • 后缀数组_最长回文

    给定一个字符串,求最长回文子串。算法分析:穷举每一位,然后计算以这个字符为中心的最长回文子串。注意这里要分两种情况...

  • 字符串算法小结

    hash kmp和ac自动机 后缀数组,后缀自动机,后缀树 扩展kmp manacher算法 回文自动机 可删改的...

  • KMP

    kmp周期 最短回文串next数组可以得到前缀和后缀中相同的长度有多少,然后将回文串反转和不反转拼接起来

  • Manacher 算法学习笔记

    前言 给定一个字符串,求出其最长回文子串。例如:s="abcd",最长回文长度为 1;s="ababa",最长回文...

  • 2020-08-25 力扣题五

    最长回文数

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • 打卡-最长回文子串

    最长回文子串(中等)

  • 大学被虐了很久的kmp算法

    关键在于实现最长公共前后缀table。一个字符串的最长公共前后缀举例:比如"abcdabc"的最长公共前后缀为“a...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • 字符串的几个问题

    1.最长公共子序列2.最长公共子串3.最长回文串4.最长回文序列5.最长递增序列6.最长先增后减序列7.(最短)编...

网友评论

      本文标题:后缀数组_最长回文

      本文链接:https://www.haomeiwen.com/subject/hqtzgttx.html