微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

字符串——Seek the Name, Seek the Famekmp应用

传送门:2752 -- Seek the Name, Seek the Fame

题意:给一个字符串s,要求所有最后一个字符结尾的相同前缀和后缀的长度,自身也算

Sample Input

ababcababababcabab
aaaaa

Sample Output

2 4 9 18
1 2 3 4 5

样例1解释:

a b a b c a b a b a b a b c a b a b
对于9:

a b a b c a b a b a b a b c a b a b

对于4

a b a b c a b a b a b a b c a b a b

对于2

a b a b c a b a b a b a b c a b a b

思路:一般的kmp处理完每个位置都只会有一个next值,所以这里并不能。但kmp具有一个很强的性质。

证明是应该不对

字符串——周期(kmp)_北岭山脚鼠鼠的博客-CSDN博客 这个有很大关系。

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef unsigned long long ull;
const int N=1e6+10;
char a[N];
int ne[N];
int n,m;
void get()
{
     ne[1]=0;
    int j=0;
    for(int i=2;i<=n;i++)
    {
        while(j>0&&a[i]!=a[j+1]) j=ne[j];
        if(a[i]==a[j+1]) j++;
        ne[i]=j;
    }
}
int main()
{
    while(cin>>a+1)
    {
     n=strlen(a+1);
    get();
    vector<int>v;
    int j=n;

    while(ne[j]!=0)
    {
        v.push_back(ne[j]);
        j=ne[j];
    }
    for(int i=v.size()-1;i>=0;i--)
        cout<<v[i]<<' ';
    cout<<n<<endl;
    }
    return 0;
}

原文地址:https://www.jb51.cc/wenti/3287374.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐