http://acm.hdu.edu.cn/showproblem.php?pid=2846
题意:在一堆字符串中,查找子串数量。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=25;
struct Node{
Node *next[26];
int cc,id;
Node(){
for(int i=0;i<26;i++)
next[i]=NULL;
cc=0;id=-1;
}
};
void BuildT(Node *pt,char *str,int id){
int len=strlen(str);
for(int i=0;i<len;i++){
int t=str[i]-'a';
if(pt->next[t]==NULL)
pt->next[t]=new Node();
pt=pt->next[t];
if(pt->id!=id){ //防止一个字符串内子串重复
pt->id=id;
pt->cc++;
}
}
}
int SearchT(Node *pt,char *str){
int len=strlen(str);
for(int i=0;i<len;i++){
int t=str[i]-'a';
if(pt->next[t]!=NULL)
pt=pt->next[t];
else return 0;
}
return pt->cc;
}
int main()
{
int i,j,len,n,m,t;
char cs[NM];
while(~scanf("%d",&m)){
Node *pt=new Node();
for(i=0;i<m;i++){
scanf("%s",cs);
len=strlen(cs);
for(j=0;j<len;j++)
BuildT(pt,&cs[j],i+1); //abcd-bcd-cd-d
}
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",cs);
t=SearchT(pt,cs);
printf("%d\n",t);
}
}
return 0;
}