您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: