Keywords SearchTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 77051 Accepted Submission(s): 26679 Problem Description In the modern time, Search engine came into the life of everybody like Google, Baidu, etc.
Input First line will contain one integer means how many cases will follow by.
Output Print how many keywords are contained in the description.
Sample Input 1 5 she he say shr her yasherhs
Sample Output 3
|
应该是最简单的多字符进行匹配了吧,就留个板子不解释了。
#include<bits/stdc++.h>
using namespace std;
char aim[155],now[1000005];
typedef long long ll;struct Tire{
static const int NODENUM=(int)1e6+5,R=26;
int nxt[NODENUM][R],fail[NODENUM],ed[NODENUM];
int rt,tot;
int newnode(){
for(int i=0;i<R;i++)nxt[tot][i]=-1;
ed[tot]=0;
return tot++;
}
void init(){
tot=0;
rt=newnode();
}
void insert(char *s){
int now=rt,len=strlen(s);
for(int i=0;i<len;i++){
int val=s[i]-'a';
if(nxt[now][val]==-1)nxt[now][val]=newnode();
now=nxt[now][val];
}
ed[now]++;
}
void build(){
queue<int>q;
fail[rt]=rt;
for(int i=0;i<R;i++){
if(nxt[rt][i]==-1)nxt[rt][i]=rt;
else {
fail[nxt[rt][i]]=rt;
q.push(nxt[rt][i]);
}
}
while(!q.empty()){
int now=q.front();q.pop();
for(int i=0;i<R;i++){
if(nxt[now][i]==-1)nxt[now][i]=nxt[fail[now]][i];
else {
fail[nxt[now][i]]=nxt[fail[now]][i];
q.push(nxt[now][i]);
}
}
}
}
int query(char *s){
int now=rt,res=0,len=strlen(s);
for(int i=0;i<len;i++){
int val=s[i]-'a';
now=nxt[now][val];
int tmp=now;
while(tmp!=rt){
res+=ed[tmp];
ed[tmp]=0;
tmp=fail[tmp];
}
}
return res;
}
}ac;
int main(){
int t,n;
cin>>t;
while(t--){
ac.init();
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",aim);
ac.insert(aim);
}
ac.build();
scanf("%s",now);
int ans=ac.query(now);
printf("%d\n",ans);
}
return 0;
}