POJ 3461 : Qualification - 字符串匹配,KMP算法
2015-01-10 21:47
260 查看
大致题意:
给出一个字符串,一个文本,输出这个字符串在文本中出现的次数。
思路:
w是模式,t是目标。
应用KMP算出w的后缀函数next,然后使用next计算单词w在文本t中出现的频率cnt。
KMP KMP
给出一个字符串,一个文本,输出这个字符串在文本中出现的次数。
思路:
w是模式,t是目标。
应用KMP算出w的后缀函数next,然后使用next计算单词w在文本t中出现的频率cnt。
KMP KMP
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int W = 10010, T = 1000010; int match(char w[], char s[], int next[]){ int cnt = 0; int slen = strlen(s); int wlen = strlen(w); int p = 0, cur = 0; while(cur < slen){//未扫描完s所有字符 if(s[cur] == w[p]){//s、w当前字符相同,则二者指针都右移1 cur++; p++; }else if(p >= 0){ p = next[p]; }else{ cur++; p = 0; } if(p == wlen){ cnt++; p = next[p]; } } return cnt; } int main(){ int tt; scanf("%d", &tt); while(tt--){ char w[W], t[T]; scanf("%s%s", w, t); int suf[W]; suf[0] = -1; suf[1] = 0; int p = 0; for(int cur = 2; cur <= strlen(w); cur++){ while(p >= 0 && w[p] != w[cur - 1]) p = suf[p]; suf[cur] = ++p; } printf("%d\n", match(w, t, suf)); } return 0; }
相关文章推荐
- POJ 3461 Oulipo(字符串匹配,KMP算法)
- 字符串匹配之KMP算法(POJ 3461 Oulipo)
- poj 3461 Oulipo 字符串匹配 KMP算法
- PKU3461(Oulipo)字符串匹配-KMP算法
- POJ 3461 Oulipo(KMP字符串匹配)
- POJ-3461 Oulipo-匹配的字符有几个(KMP算法)
- POJ 3461 Oulipo (KMP字符串匹配·统计p在s中出现次数)
- poj 3461 Oulipo kmp字符串匹配
- HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)
- poj 3461(kmp字符串匹配模板)
- HDU 1686 Oulipo , 同 POJ 3461 Oulipo (字符串匹配,KMP)
- KMP 字符串匹配 POJ 3461 Oulipo
- POJ-1266/KMP算法/字符串匹配
- poj-3461 kmp字符串匹配问题
- 字符串匹配的KMP算法
- 字符串匹配的KMP算法
- 字符串匹配——KMP算法
- poj 3461 kmp算法
- 大白话字符串匹配的KMP算法
- 字符串匹配的KMP算法