POJ 3461 Oulipo (简单kmp)

来源:互联网 发布:我好想你网络歌手 编辑:程序博客网 时间:2024/05/19 15:20
题目类型  kmp

题目意思
问一个最长 10000 的串在一个最长 100 0000 的串中出现了多少次 (可重叠)

解题方法
kmp的基本用法 理解清楚失配函数的定义即可

参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1e4 + 10;int next[maxn];char w[maxn], t[maxn*100];void get_next() {int lenw = strlen(w);next[0] = next[1] = 0;for( int i=1; i<lenw; i++ ) {int f = next[i];while(f && w[f] != w[i]) f = next[f];if(w[f] == w[i]) next[i+1] = f + 1;else next[i+1] = 0;}}int main() {freopen("out", "r", stdin);int tcase;scanf("%d", &tcase);while(tcase--) {scanf("%s%s", w, t);get_next();int lenw = strlen(w), lent = strlen(t);int ans = 0, f = 0;for( int i=0; i<lent; i++ ) {while(f && w[f] != t[i]) f = next[f];if(w[f] == t[i]) f++;if(f == lenw) {f = next[f];ans++;}}printf("%d\n", ans);}return 0;}
0 0
原创粉丝点击