Codeforces 432D Prefixes and Suffixes (KMP后缀数组)

Posted suncongbo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 432D Prefixes and Suffixes (KMP后缀数组)相关的知识,希望对你有一定的参考价值。

题目链接: https://codeforces.com/contest/432/problem/D

题解L

做法一: KMP

显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大小。

做法二: 后缀数组

按照height分组,二分查找即可。

代码

KMP:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<utility>
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;

以上是关于Codeforces 432D Prefixes and Suffixes (KMP后缀数组)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 432D Prefixes and Suffixes (KMP后缀数组)

CodeForces 432D Prefixes and Suffixes:KMP + dp

432D Prefixes and Suffixes

CF432D Prefixes and Suffixes

[CF432D] Prefixes and Suffixes - KMP

Infinite Prefixes CodeForces - 1295B