SoL:BM,KMP算法。。。找出子串的个数
字符串匹配BM(Boyer-Moore)算法学习心得:
http://www.cnblogs.com/a180285/archive/2011/12/15/BM_algorithm.html
BM:
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int T_maxn = 1000000 + 10;
const int P_maxn = 10000 + 10;
//T 母串 P 模式串
char T[T_maxn],P[P_maxn];
int last(char *p,char c)
{
int len=strlen(p),count=0;
char *pp=p+len-1;
while(pp>=p)
{
if(*pp==c)
return len-count-1;
pp--;
count++;
}
return -1;
}
int min(int a,int b)
{
return (a<=b)?a:b;
}
int BM_index(char *T,char *P)
{
int n=strlen(T);
int m=strlen(P);
int i=m-1,j=m-1;
while(i<=n-1)
{
if(T[i]==P[j])
{
if(j==0) return i;
else i--,j--;
}
else
{
i=i+m-min(j,1+last(P,T[i]));
j=m-1;
}
}
return -1;
}
//输出母串T中包含P的数量
int sum(char *T,char *P,int s)
{
int e=BM_index(T+s,P);
return e==-1?0:1+sum(T,P,s+e+1);
}
int main()
{
int ans;
char ch[8]="bkpstor";
while(~scanf("%s",T))
{
ans=sum(T,ch,0);
if(ans)
printf("Warning\n");
else
printf("Safe\n");
}
return 0;
}
KMP:
//统计模式串在主串中出现的次数
//W 子串 T 母串
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
using namespace std;
const int maxn = 10000 + 10;
const int maxm = 1000000 + 10;
char T[maxm];
char W[8]="bkpstor";
int next[maxn];
int wlen,tlen;
void getNext()
{
int j,k;
j=0;k=-1;next[0]=-1;
while(j<wlen)
{
if(k==-1||W[j]==W[k])
{
next[++j]=++k;
}
else k=next[k];
}
}
int KMP_count()
{
int ans=0;
int i,j=0;
if(wlen==1&&tlen==1)
{
if(W[0]==T[0]) return 1;
else return 0;
}
getNext();
for(i=0;i<tlen;i++)
{
while(j>0&&T[i]!=W[j])
j=next[j];
if(W[j]==T[i]) j++;
if(j==wlen)
{
ans++;
j=next[j];
}
}
return ans;
}
int main()
{
while(~scanf("%s",&T))
{
wlen=strlen(W);
tlen=strlen(T);
int Ans=KMP_count();
if(Ans)
printf("Warning\n");
else
printf("Safe\n");
}
return 0;
}