2020年字符串专题训练赛03

I:Prefixes and Suffixes
题目大意:给一个串,找到这样的子串:它既是这个母串的前缀,又是这个母串的后缀。统计这样的串的个数,长度和在母串中总共的出现次数。
前后缀问题一般都是kmp问题
因此我们会去考虑用kmp的next数组解决问题
//这个题我以前做过,然后比赛的时候没看到这个题gg
附上代码

#include
using namespace std;
const int N = 1e5;
char a[N+3];
int nxt[N+3];
int sz[N+3];
vector<pair<int,int> > ans;
int n;
 
void KMP()
{
    nxt[0] = nxt[1] = 0;
    for(int i=2; i<=n; i++)
    {
        nxt[i] = nxt[i-1];
        while(nxt[i] && a[nxt[i]+1]!=a[i])
        {
            nxt[i] = nxt[nxt[i]];
        }
        if(a[nxt[i]+1]==a[i]) nxt[i]++;
    }
}
 
int main()
{
    scanf("%s",a+1); n = strlen(a+1);
    for(int i=1; i<n+1-i; i++) swap(a[i],a[n+1-i]);
    KMP();
    for(int i=1; i<=n; i++) sz[i] = 1;
    for(int i=n; i>=1; i--) sz[nxt[i]] += sz[i];
    for(int i=n; i>0; i=nxt[i])
    {
        ans.push_back(make_pair(i,sz[i]));
    }
    printf("%d\n",ans.size());
    for(int i=ans.size()-1; i>=0; i--) printf("%d %d\n",ans[i].first,ans[i].second);
    return 0;
}

你可能感兴趣的:(acm)