题目链接:
http://poj.org/problem?id=3461
题目大意:
给一个字符串T,表示文章,再给一个字符串W,表示单词。T和W都只包含26个大写英文字母。
现在计算单词W在文章T中出现的次数。W在T中出现的次数必须连续完全匹配,没两次匹配可能
有重叠的部分。
思路:
先求出字符串W的Next[]指针,然后进行匹配,当一次匹配成功后,继续回退到Next[j]向后进行
匹配,直到字符串T的末尾。此时,得到的匹配成功次数为所求,即W在T中出现的次数。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1000010; char T[MAXN],W[MAXN]; int Next[MAXN],len1,len2; void GetNext() { int i = 0,j = -1; Next[0] = -1; while(i < len2) { if(j == -1 || W[i] == W[j]) { i++; j++; Next[i] = j; } else j = Next[j]; } } int KMP() { len1 = strlen(T); len2 = strlen(W); GetNext(); int i = 0,j = 0; int Ans = 0; while(i < len1) { if(j == -1 || T[i] == W[j]) i++,j++; else j = Next[j]; if(j == len2) { Ans++; j = Next[j]; } } return Ans; } int main() { int N; cin >> N; while(N--) { cin >> W >> T; int ans = KMP(); cout << ans << endl; } return 0; }
时间: 2024-10-07 06:10:08