题目链接:
http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1246
解:
直接用kmp整就行,妈的智障,一开始还用AC自动机。
因为用一个1e6的char数组存取,用KMP需要注意的就是两个串之间连接部分不能算上。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdlib>
using namespace std;
const int maxn=1e6+5;
int pl,sl;char s[maxn],p[maxn];int lenth;int next1[maxn];int sum;
void get_next()
{
int k=-1,j=0;
next1[0]=-1;
while(j<pl)
{
if(k==-1||p[j]==p[k])
{
j++;k++;
next1[j]=k;
}
else
k=next1[k];
}
}
int KMP(char s[],char p[])
{
int i=0,j=0;
get_next();
while(j<pl&&i<sl)
{
if(j==-1||s[i]==p[j])
{
i++;j++;
}
else j=next1[j];
if(j==pl)
{
sum++;j=0;
}
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(s,0,sizeof(s));
memset(p,0,sizeof(p));
lenth=0;
for(int i=1;i<=n;i++)
{
scanf("%s",s+lenth);
lenth=strlen(s);
s[lenth]='#';
lenth++;
}
//printf("%s\n",s);
sl=strlen(s);
//cout<<sl<<endl;
scanf("%s",p);
pl=strlen(p);
sum=0;
printf("%d\n",KMP(s,p));
}
return 0;
}