bzoj 3620 似乎在梦中见过的样子(KMP)
2016-03-29 18:23
363 查看
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=3620
【题意】
给定一个字符串,统计有多少形如A+B+A的子串,要求A>=K,B>=1。
【思路】
枚举左端点i,对字符串s[i..n]统计答案。
放个指针,然后枚举右端点j,如果指针超过长度一半则沿fail向前找,设指针为k。如果匹配则满足s[i..k]==s[j-k+1..j],最后判定一下长度限制。
【代码】
http://www.lydsy.com/JudgeOnline/problem.php?id=3620
【题意】
给定一个字符串,统计有多少形如A+B+A的子串,要求A>=K,B>=1。
【思路】
枚举左端点i,对字符串s[i..n]统计答案。
放个指针,然后枚举右端点j,如果指针超过长度一半则沿fail向前找,设指针为k。如果匹配则满足s[i..k]==s[j-k+1..j],最后判定一下长度限制。
【代码】
#include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int N = 2e4+10; int n,K; ll ans; int f ; char s ; void KMP(char *s) { int n=strlen(s+1); int j=0,now=0; for(int i=2;i<=n;i++) { while(j&&s[j+1]!=s[i]) j=f[j]; if(s[j+1]==s[i]) j++; f[i]=j; while(now&&s[now+1]!=s[i]) now=f[now]; if(s[now+1]==s[i]) now++; while(2*now>=i) now=f[now]; if(now>=K) ans++; } } int main() { scanf("%s%d",s+2,&K); int n=strlen(s+2); for(int i=1;i<=n;i++) KMP(s+i); printf("%lld\n",ans); return 0; }
相关文章推荐
- ssh链接centos服务器速度过慢问题收集
- 实现activity全屏显示
- SpringMVC入门教程及其原理讲解
- 爬虫导入
- 命名规范
- github 代码托管工具
- 【ES6】之 Arrow Function箭头函数
- TestNG 入门
- RecyclerView的上拉加载,下拉刷新
- 好玩的linux命令
- angular先加载页面再执行事件,特别在动态生成id,然后做echarts等图表
- Qt自定义委托在QTableView中绘制控件、图片、文字(内容比较全)
- BZOJ1218 [HNOI2003] 激光炸弹
- 第五周技术博客
- noip2002 矩形覆盖
- JFinal+maven+freemarker入门教程
- FFmpeg的一些关键的数据结构(二)
- Mockito:一个强大的用于Java开发的模拟测试框架
- Python 实现简单的爬虫功能并保存到本地
- Nginx 500错误总结