标签:
题意还是比較简单的,思路也比較好想!
做本题首先要理解什么是tire树,我的一篇转载的文章有非常具体的过程:http://blog.csdn.net/u012313382/article/details/38493113
看完了那篇文章就直接给AC代码吧(自己參照模板打的代码):
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stdlib.h> using namespace std; #define maxn 26 typedef struct node //num是经过的次数 { //int str; //str在本题中没实用处。可是在统计单词的问题上还是能够去记录单词数的 int num; struct node *next[maxn]; }trienode,*trie; struct node *root; void Insert(char *s) { int i,len=strlen(s); trienode *p=root,*q; for(i=0;i<len;i++) { if(p->next[s[i]-'a']==NULL) //假设这个它的子节点没有。则新建一个 { q=(struct node *)malloc(sizeof(struct node)); memset(q->next,NULL,sizeof(q->next)); q->num=1; // q->str=0; p->next[s[i]-'a']=q; } else { p->next[s[i]-'a']->num++; } p=p->next[s[i]-'a']; } // p->str=1; } int find(char *s) { int i,len=strlen(s); trienode *p=root,*q; for(i=0;i<len;i++) { if(p->next[s[i]-'a']==NULL) return 0; p=p->next[s[i]-'a']; } return p->num; } int main() { char s[maxn]; root=(struct node *)malloc(sizeof(struct node)); memset(root->next,NULL,sizeof(root->next)); // root->str=0; root->num=0; while(gets(s)) { if(s[0]==0) break; Insert(s); } while(cin>>s) cout<<find(s)<<endl; return 0; }
#include<iostream> # include<cstring> #include<cstdio> using namespace std; const int maxn=500000; char wen[20]; struct node{ int tot; int child[26]; node() { tot=0; memset(child,0,sizeof(child)); } }tree[maxn]; int sz=0; void insert(char *s) { int u=0; int h=strlen(s); for(int i=0;i<h;i++) { int pos=s[i]-'a'; if(tree[u].child[pos]==0) tree[u].child[pos]=++sz; u=tree[u].child[pos]; tree[u].tot++; } } int find(char *t) { int u=0,h=strlen(t); for(int i=0;i<h;i++) { int pos=t[i]-'a'; if(tree[u].child[pos]==0) return 0; u=tree[u].child[pos]; } return tree[u].tot; } int main() { while(gets(wen)) { if(strlen(wen)==0) break; insert(wen); } while(gets(wen)) { printf("%d\n",find(wen)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/5349821.html