KMP模板
#include<bits/stdc++.h> using namespace std; /*************************KMP模板****************************/ int f[101];//优化后的失配指针,记住这里f要比P多一位,因为P到m-1即可,但是f还要计算出m的失配指针 int f2[101];//f2用来保存KM指针,是为优化f的失配指针,f保存的是优化之后的失配指针 char T[1000];//待匹配串 char P[100];//模板串 void getFail(char *P, int *f) { int m = strlen(P); f[0] = f[1] = 0; f2[0]=f2[1]=0; for(int i = 1; i < m; i++) { int j = f2[i]; while(j && P[i] != P[j] ) j = f2[j]; f2[i+1] = f[i + 1] = (P[i] == P[j]) ? j + 1 : 0; //既然i+1的失配位置指向j+1,但是P[i+1]和P[j+1]的内容是相同的 //所以就算指针从i+1跳到j+1去,还是不能匹配,所以f[i+1]直接=f[j+1] if(f[i+1]==j+1 && P[i+1]==P[j+1]) f[i+1]=f[j+1]; } } void find(char *T, char *P, int *f) //找到所有匹配点 { int n = strlen(T); int m = strlen(P); int j = 0; for(int i = 0; i < n; i++) { while(j && T[i] != P[j]) j = f[j]; if(T[i] == P[j]) j++; if(j == m) printf("%d\n", i - m + 1); } } /*************************KMP模板****************************/ int main() { return 0; }
我每天都在努力,只是想证明我是认真的活着.