标签:hdu
//给定的字符串在模式串中出现的个数 # include <cstdio> # include <algorithm> # include <cstring> # include <iostream> using namespace std; # define MAX 26 typedef struct Trie_Node { int count;//记录包含该结点的单词个数 int id;//最后一次经过此结点的商品的id Trie_Node *next[MAX]; } Trie; void insert(Trie *root,char *s,int id) { Trie *p=root; while(*s!='\0') { if(p->next[*s-'a']==NULL) { Trie *temp=(Trie*)malloc(sizeof(Trie)); for(int i=0; i<MAX; i++) { temp->next[i]=NULL; } temp->count=0; temp->id=-1;//-1表示没有商品 p->next[*s-'a']=temp; } p=p->next[*s-'a']; if(p->id!=id) //如果当前结点的商品ID不等于要插入商品的ID,则计数器count++,并且重新置ID的值 { p->id=id; p->count++; } s++; } } int search(Trie *root,char *s) { Trie *p=root; for(int i=0; s[i]!='\0'; i++) { if(p->next[s[i]-'a']==NULL||p==NULL) return false; p=p->next[s[i]-'a']; } return p->count; } int main() { int i,j; int n,m; char s[21]; Trie *root=(Trie*)malloc(sizeof(Trie)); for(i=0; i<MAX; i++) { root->next[i]=NULL; } root->count=0; root->id=-1; scanf("%d",&n); for(i=0; i<n; i++) { scanf("%s",s); for(j=0; j<strlen(s); j++) //将字符串X=X1X2...Xn的分别以X1,X2...Xn开头的后缀字符串插入到Trie树中 { insert(root,s+j,i); } } scanf("%d",&m); for(i=0; i<m; i++) { scanf("%s",s); printf("%d\n",search(root,s)); } return 0; }
标签:hdu
原文地址:http://blog.csdn.net/lp_opai/article/details/39155555