CodeForces - 432D Prefixes and Suffixes
Posted awhitewall
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 432D Prefixes and Suffixes相关的知识,希望对你有一定的参考价值。
这道题竟然不是(spj)?(我的英语好菜啊)
很容易想到用(kmp)。
第一个答案就是从(n)开始往前找(nxt),显然这可以保证匹配。
第二个答案其实也很简单:我们用(nxt)来做一个(dp)。因为我们最后输出的是(dp[len[i]])((len)是相同前缀后缀的长度),这显然是此长度的最后一个状态,那我们倒着做(dp),最后总会被最后一个状态记录。
#include<cstdio>
#include<cstring>
const int N = 1e5 + 2;
char s[N];
int nxt[N], n, p[N], cnt[N], m;
int read() {
int x = 0, f = 1; char s;
while((s = getchar()) > '9' || s < '0') {if(s == '-') f = -1;}
while(s <= '9' && s >= '0') {
x = (x << 1) + (x << 3) + (s ^ 48);
s = getchar();
}
return x * f;
}
void getNxt() {
int j = 0;
for(int i = 2; i <= n; ++ i) {
while(j && s[i] != s[j + 1]) j = nxt[j];
if(s[i] == s[j + 1]) ++ j;
nxt[i] = j;
}
}
int main() {
scanf("%s", s + 1); n = strlen(s + 1);
getNxt();
int pos = n;
while(pos) {
p[++ m] = pos;
pos = nxt[pos];
}
for(int i = 1; i <= n; ++ i) cnt[i] = 1;
for(int i = n; i >= 1; -- i) cnt[nxt[i]] += cnt[i];
printf("%d
", m);
for(int i = m; i >= 1; -- i) printf("%d %d
", p[i], cnt[p[i]]);
return 0;
}
以上是关于CodeForces - 432D Prefixes and Suffixes的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 432D Prefixes and Suffixes
CodeForces 432D Prefixes and Suffixes:KMP + dp