HDU-2846-Repository

来源:互联网 发布:音乐信息编辑软件 编辑:程序博客网 时间:2024/06/08 13:34

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;}


 

原创粉丝点击