您的位置:首页 > 其它

POJ 3461 : Qualification - 字符串匹配,KMP算法

2015-01-10 21:47 260 查看
大致题意:
给出一个字符串,一个文本,输出这个字符串在文本中出现的次数。
思路:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  KMP 字符串匹配 poj zoj