Oulipo(kmp算法)
题目意思就是找子串在一个长串中出现的次数。 因为数据较大,一般的做法都超时,看了看kmp算法,用这个算法做的。这个算法最难的就是求那个next数组吧。
#include<iostream> #include<functional> #include<queue> #include<vector> #include <algorithm> #include <string> #include <cstring> #include <cstdio> #define Max 1000000000 using namespace std; string x,y; int num1,num2; void getnext(int * next) { next[0]=-1; int i=0,j=1; while(j<num1) { if (x[i]==x[j]||i==-1) { i++; j++; if (x[i]!=x[j]) next[j]=i; else next[j]=next[i]; } else { i=next[i]; } } } void Find(int *next) { int i=0,j=0; int Count=0; while(j<num2) { if (x[i]==y[j]||i==-1) { i++; j++; } else { i=next[i]; } if (i==num1) { i=next[i]; Count++; } } cout<<Count<<endl; } int main() { int n; cin>>n; while(n--) { int next[15000]; cin>>x>>y; num1=x.size(); num2=y.size(); getnext(next); Find(next); } return 0; }