Trie树
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int next[27];
int sum;
void init()
{
sum=0;
memset(next,-1,sizeof(next));
}
};
node L[1000500];
int tot=0;
void add(char s[],int len)
{
int now=0;
for(int i=0;i<len;++i)
{
L[now].sum++;
int tmp=s[i]-'a';
int next=L[now].next[tmp];
if(next==-1)
{
next=++tot;
L[next].init();
L[now].next[tmp]=next;
}
now=next;
}
L[now].sum++;
}
int query(char s[],int len)
{
int now=0;
for(int i=0;i<len;++i)
{
int tmp=s[i]-'a';
int next=L[now].next[tmp];
if(next==-1)return 0;
now=next;
}
return L[now].sum;
}
int main()
{
// freopen("data.txt","r",stdin);
int n;
scanf("%d",&n);
getchar();
tot=0;
L[0].init();
while(n--)
{
char s[20];
gets(s);
int len=strlen(s);
add(s,len);
}
scanf("%d",&n);
getchar();
while(n--)
{
char s[20];
gets(s);
int len=strlen(s);
printf("%d\n",query(s,len));
}
return 0;
}
KMP算法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char ori[1000006];
char par[10006];
int next[10006];
void getnext(int n)
{
if(n==0)
{
next[n]=-1;
return ;
}
if(n==1)
{
next[1]=0;
return ;
}
getnext(n-1);
int now=next[n-1];
while(1)
{
if(par[now+1]==par[n])
{
next[n]=now+1;
return ;
}
now=next[now];
if(now==0){next[n]=0;return ;}
}
}
int kmp()
{
int ans=0;
int olen=strlen(ori);
int plen=strlen(par);
olen--;
plen--;
par[plen+1]='a';
ori[olen+1]='b';
int q=0;
for(int p=0;p<=olen;)
{
if(q==plen)
{
ans++;
}
if(ori[p+1]==par[q+1])
{
p++;
q++;
}
else
{
q=next[q];
if(q==-1)
{
q++;
p++;
}
}
}
return ans;
}
int main()
{
//freopen("data.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
par[0]='c';
ori[0]='d';
scanf("%s",par+1);
scanf("%s",ori+1);
int len=strlen(par);
next[0]=-1;
next[1]=0;
getnext(len-1);
printf("%d\n",kmp());
}
return 0;
}