HDU-2846-Repository
http://acm.hdu.edu.cn/showproblem.php?pid=2846
题意是给出一些模式串,再给出几个询问,询问给出的字符串在多少个模式串中出现
比如字符串abc所含的字串有a,ab,abc,b,bc,c
可用字典树解决,字典树能很好的处理前缀出现的次数,所以可将模式串分解,依次插入
需要注意的是对于同一个模式串的不同子串可能有相同的前缀,为了避免多次计算,可以添加字典树节点的信息,添加num记录最后插入的字符串是第num个模式串的子串
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; int n,m; struct node { int count; int num; //最后插入的字符串是第num个模式串的子串 node *childs[26]; node() { count=0; num=0; int i; for(i=0;i<26;i++) childs[i]=NULL; } }; node *root=new node; node *current,*newnode; void insert(char *str,int k) { int i,m; current=root; for(i=0;i<strlen(str);i++) { m=str[i]-'a'; if(current->childs[m]!=NULL) { current=current->childs[m]; if(current->num!=k) { ++(current->count); current->num=k; } } else { newnode=new node; ++(newnode->count); newnode->num=k; current->childs[m]=newnode; current=newnode; } } } int search(char *str) { int i,m; current=root; for(i=0;i<strlen(str);i++) { m=str[i]-'a'; if(current->childs[m]==NULL) return 0; current=current->childs[m]; } return current->count; } int main() { int i,j,len; char s1[20],s2[20],s3[20]; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%s",s1); len=strlen(s1); for(j=0;j<len;j++) { strncpy(s2,s1+j,len-j); s2[len-j]='\0'; insert(s2,i); } } scanf("%d",&m); while(m--) { scanf("%s",s3); printf("%d\n",search(s3)); } return 0; }