您的位置:首页 > 其它

Codeforces 432D Prefixes and Suffixes

2016-06-30 21:51 447 查看
http://codeforces.com/problemset/problem/432/D

题目大意:

给出一个字符串,求有多少种长度的前缀和后缀相等,并且得到的这个子串在原字符串中出现的次数。

思路:预处理kmp,发现从n开始的next
一直往下都是合法的前缀后缀,先记录下来,然后从n往1dp,每次都是

dp[i]++,dp[next[i]]+=dp[i],这样转移之后再输出即可。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
char s[200005];
int n,p[200005],c[200005],dp[200005];
int read(){
int t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
p[1]=0;int j=0;
for (int i=2;i<=n;i++){
while (j>0&&s[j+1]!=s[i]) j=p[j];
if (s[j+1]==s[i]) j++;
p[i]=j;
}
int tot=0;
for (int i=p
;i;i=p[i]){
c[++tot]=i;
}
for (int i=n;i;i--){
dp[i]++;
dp[p[i]]+=dp[i];
}
printf("%d\n",tot+1);
for (int i=tot;i>=1;i--){
printf("%d %d\n",c[i],dp[c[i]]);
}
printf("%d 1\n",n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: