KMP模板
2017-04-17 23:29
253 查看
#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; else k=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++; } else j=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; else return 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; }
相关文章推荐
- KMP模板
- hdoj1711-- Number Sequence(KMP模板)
- KMP模板
- kmp字符串匹配模板(c++) 4000
- KMP模式匹配算法模板
- kmp模板
- KMP 算法模板
- HDU2087 剪花布条 KMP模板
- Number Sequence(kmp模板)
- KMP模板
- kmp模板
- HDU Number Sequence (KMP模板)
- 扩展KMP模板
- 【NOIP模板】KMP
- KMP模板及next 数组优化
- kmp-洛谷P3375 【模板】KMP字符串匹配
- KMP模板(具体代码)
- HDU 1711 Number Sequence【KMP】【模板题】【水题】(返回匹配到的第一个字母的位置)
- HDU-1711-kmp模板
- 数据结构—KMP模板