爲了紀念第一次用KMP解決一道題,在這寫下了,算是當做一個模板吧。
Description
Input
Output
Sample Input
abcde a3 aaaaaa aa #
Sample Output
0 3
#include<iostream>
#include<stdlib.h>#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX 1000
int ans;
void makeNext(char P[],int next[])
{
next[0] = 0;
int l = strlen(P);
int k = 0;
for (int i = 1 ; i < l ; i++)
{
while (k > 0 && P[k] != P[i])
k = next[k-1];
if (P[i] == P[k])
k++;
next[i] = k;
}
}
void KMP(char T[],char P[],int next[])
{
int goal = strlen(P);
int length = strlen(T);
makeNext(P,next);
int k = 0;
for (int i = 0 ; i < length ; i++)
{
while (k > 0 && P[k] != T[i])
k = next[k-1];
if (P[k] == T[i])
k++;
if (k == goal)//匹配完成
{
ans++;
k = 0; //重新匹配
}
}
}
int main()
{
char T[MAX+11];
char P[MAX+11];
int next[MAX+11];
while (scanf ("%s",T)!=EOF)
{
if (T[0] == '#')
break;
scanf ("%s",P);
ans = 0;
KMP(T,P,next);
printf ("%d\n",ans);
}
return 0;
}