KMP模板

来源:互联网 发布:卡帝乐鳄鱼 知乎 编辑:程序博客网 时间:2024/06/08 13:53
#include<bits/stdc++.h>using namespace std;const int LEN= 1 << 23;string S,T;int next[LEN];void getnext(){int lenS=S.length();int q=0,k=-1;next[0]=-1;while(q<lenS){if(k==-1 || S[q]==S[k])next[++q]=++k;elsek=next[k];}}int firstappear(){int lenT=T.length();int lenS=S.length();int i=0;int j=0;getnext();while(i<lenT && j<lenS){if(j==-1 || T[i]==S[j]) //从子串第一个字母开始匹配 或 母串和子串相等时 {i++;j++;}elsej=next[j];if(j==lenS)return i-lenS;return -1;}}int countappear(){int lenT=T.length();int lenS=S.length();if(lenT==1 && lenS==1){if(S[0]==T[0])return 1;elsereturn 0;}int i=0;int j=0;int ans=0;getnext();for(i=0;i<lenT;i++){while(j>0 && T[i]!=S[j]){j=next[j];}if(T[i]==S[j])j++;if(j==lenS){ans++;j=next[j];}}return ans;} int main(){int TT;cin>>TT;while(TT--){cin>>S>>T;cout<<"S字符串在T字符串中第一次出现的位置是:"<<firstappear()<<endl;cout<<"S字符串在T字符串中出现的次数是:"<<countappear()<<endl; }return 0; } 

0 0