POJ3461 Oulipo KMP算法应用
来源:互联网 发布:slam算法介绍 编辑:程序博客网 时间:2024/06/09 14:03
题目描述
给定主串和模式串,问模式串在主串中出现的次数
Sample Input
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
Sample Output
1
3
0
解题思路:KMP算法是找到一个匹配就跳出,这题是要计数,所以我们把KMP算法稍微改一下即可,在找到一个匹配(即j=模式串长度)时计数器++,再从next[j]开始找就好了。详见代码
#include <cstdio>#include <cstring>void GetNext(char* p,int next[]){ int pLen = strlen(p); int k = -1;//k记录的是next[j] next[0] = k; int j = 0; while (j < pLen) { /** next[j]=-1时,next[j+1]肯定是0;p[j]=p[k]时,next[j+1]=next[j]+1 */ if (k == -1 || p[j] == p[k]) { ++k; ++j; if(p[j] != p[k]) next[j] = k; else next[j] = next[k]; } else k = next[k]; }}const int maxn = 1000010;char s[maxn];char p[10010];int next[10010];int main(){ int t; scanf("%d",&t); while(t--) { scanf("%s",p); GetNext(p,next); int cnt = 0; scanf("%s",s); int i=0,j=0; int len1=strlen(s),len2=strlen(p); while(i < len1) { if(j == -1 || s[i] == p[j]) { ++i; ++j; if(j == len2) { //找到了一个匹配串 cnt++; //计数器++ j = next[j]; //从next[j]继续开始匹配 } }else j = next[j]; } printf("%d\n",cnt); } return 0;}
0 0
- POJ3461 Oulipo KMP算法应用
- HDU1686 POJ3461 Oulipo KMP算法
- POJ3461——Oulipo KMP算法的应用
- 【KMP】 poj3461 Oulipo
- 【KMP】Oulipo POJ3461
- poj3461 Oulipo (kmp)
- [POJ3461] Oulipo[KMP基础]
- poj3461 Oulipo,Kmp
- POJ3461 Oulipo 【KMP】
- POJ3461 Oulipo KMP
- poj3461-Oulipo(KMP)
- poj3461 Oulipo【KMP】
- 【KMP】【POJ3461】Oulipo
- POJ3461 Oulipo(kmp)
- poj3461 Oulipo(KMP)
- 【poj3461】Oulipo(KMP)
- poj3461 Oulipo(KMP)
- POJ3461 Oulipo KMP基础
- 在FieldSet中引入JSP页面
- uva 1025 A Spy in the Metro (DP)
- 解决IAR不能给go to the defination.......
- hdu 5063 小想法
- SQL Server 查询性能优化——创建索引原则(二)
- POJ3461 Oulipo KMP算法应用
- 好记性不如烂笔头11-WEB应用的HttpServletResponse
- 【SzNOI语法百题】【d051】明天星期几
- utc时区和ntp同步设置
- Android开发之图片处理专题(一):利用软引用构建图片高速缓存
- asm.jar使用不了,Error:Could not find adb, please install Android SDK and set path to adb
- Hadoop 通过distcp进行并行复制
- MIB文件中定义宏详解
- 让年自己少走弯路的14个忠告