最长公共前后缀

字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。例如对于字符串 abacaba,其前缀有 a, ab, aba, abac, abacab,后缀有bacaba, acaba, caba, aba, ba, a。最长公共前后缀就是 aba。现给出一个长度为 N 的字符串 S,对于每个 M (0<=M 输入格式:
输入数据仅有一行,包含一个长度不超过 100,000 的仅由字母 a-z 构成的字符串。
输出格式:
对于每个 M (0,1,2,…,N−1),输出对应的最长公共前后缀长度,以空格分隔,且行尾不得有多余空格。
输入样例:
abcdabcdabce

输出样例:
0 0 0 0 1 2 3 4 5 6 7 0

#include
#include
#include
#include
using namespace std;
int dp[100001],len;
char p[100001];
void lala()
{
    int i=0,j;
    for(j=1; j<len; j++)
    {
        while(p[i]!=p[j]&&i>0)
            i=dp[i-1];
        if(p[i]==p[j])
        {
            i++;
            dp[j]=i;
        }
        else
            dp[j]=0;
    }
}
//a b c d a b c d a b c e
//0 0 0 0 1 2 3 4 5 6 7 0
int main()
{
    cin>>p;
    len=strlen(p);
    dp[0]=0;
    lala();
    for(int i=0; i<len; i++)
        if(!i)
            cout<<dp[i];
        else
            cout<<' '<<dp[i];
    return 0 ;
}

你可能感兴趣的:(最长公共前后缀)