Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 1 0
模板题
1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 const int maxn = 26; 7 struct Node{ 8 int mark; 9 Node *next[maxn]; 10 Node *fail; 11 Node(){ 12 mark = 0; 13 for(int i=0;i<maxn;i++) 14 next[i] = NULL; 15 } 16 ~Node(){ 17 for(int i=0;i<maxn;i++) 18 if(next[i]!=NULL) 19 delete next[i]; 20 } 21 }; 22 int v[600]; 23 struct Ac_Machine{ 24 Node *head; 25 char hash(char &s){//压缩 26 return s-‘a‘; 27 } 28 Ac_Machine(){ 29 head = NULL; 30 } 31 void init(){ 32 if(head!=NULL) 33 delete head; 34 head = new Node(); 35 } 36 void insert(char *s,int len,int num){ 37 Node *pt = head; 38 for(int i=0;i<len;i++){ 39 int k = hash(s[i]); 40 if(pt->next[k]==NULL){ 41 pt->next[k] = new Node(); 42 pt->next[k]->fail = head; 43 } 44 pt = pt->next[k]; 45 } 46 pt->mark=num; 47 } 48 void creat_fail(){ 49 queue<Node*> *team = new queue<Node*>(); 50 head->fail = NULL; 51 for(int i=0;i<maxn;i++) 52 if(head->next[i]!=NULL) 53 team->push(head->next[i]); 54 while(!team->empty()){ 55 Node *pt = team->front(); 56 team->pop(); 57 for(int i=0;i<maxn;i++){ 58 if(pt->next[i]==NULL) 59 continue; 60 team->push(pt->next[i]); 61 Node *pd = pt->fail; 62 while(pd!=NULL&&pd->next[i]==NULL) 63 pd = pd->fail; 64 if(pd!=NULL) 65 pt->next[i]->fail = pd->next[i]; 66 } 67 } 68 delete team; 69 } 70 int get(Node *pt){ 71 int ans = 0; 72 for(int i=0;i<maxn;i++){ 73 if(pt->next[i]==NULL) 74 continue; 75 ans+=get(pt->next[i]); 76 } 77 ans +=pt->mark; 78 pt->mark = ans; 79 return ans; 80 } 81 int Matching(char *s,int len){ 82 Node *pt = head; 83 int ans = 0; 84 for(int i=0;i<len;i++){ 85 int k = hash(s[i]); 86 if(pt->next[k]==NULL) 87 return 0; 88 pt=pt->next[k]; 89 } 90 return pt->mark; 91 } 92 }; 93 Ac_Machine machine; 94 char virus[510][210]; 95 char s[20000]; 96 queue<int> ans; 97 int main(){ 98 machine.init(); 99 while(true){ 100 gets(s); 101 int len = strlen(s); 102 if(len==0) 103 break; 104 machine.insert(s,len,1); 105 } 106 machine.get(machine.head); 107 while(scanf("%s",s)!=EOF){ 108 printf("%d\n",machine.Matching(s,strlen(s))); 109 } 110 return 0; 111 }