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],这样转移之后再输出即可。
题目大意:
给出一个字符串,求有多少种长度的前缀和后缀相等,并且得到的这个子串在原字符串中出现的次数。思路:预处理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; }
相关文章推荐
- 伪造IP包,禁止TCP连接
- CALayer2-创建新的层
- curl 工具的使用
- Yarn产生的历史背景
- 完成端口与高性能服务器程序开发
- [JZOJ4567]nekopara
- JVM——类加载机制
- 随堂笔记(二)--内存分配函数
- android基础—新建一个Activity
- 伪造IP的一段代码
- Linux常用的shell命令汇总
- what's J2EE
- php上传文件失败解决方式
- hadoop 伪分布式start-all之后datanode丢失
- centos7命令行与图形界面启动模式修改
- SSH的一些注解整理
- ORACLE频繁被锁
- Android studio 项目Gradle升级后报错Session 'app': Error Launching activity
- 详细解说STL hash_map系列
- HTTP Live Streaming直播(iOS直播)技术分析与实现