描述
小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。
- 输入
- 第一行包含一个整数T(T<=100).表示测试数据组数。
接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。
接下来n行,每行包含一个字符串,长度不大于15。
接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。 - 输出
- 输出每组小明询问数串出现的次数。
- 样例输入
-
1 5 3 hello [email protected][email protected] hello ibelieveicanac hello hello icannotacit Giveup
- 样例输出
-
3 0 0 题解:水题,就是多判断了“+”,“@”的情况,修改一下模板即可。 代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <iostream> 6 #include <ctype.h> 7 #include <iomanip> 8 #include <queue> 9 #include <stdlib.h> 10 using namespace std; 11 12 13 struct node 14 { 15 int count; 16 node *next[28]; 17 node(){ //构造函数 18 count=0; 19 memset(next,0,sizeof(next)); 20 } 21 }; 22 node *root; 23 int k=0; 24 void insert(char *a) 25 { 26 int l=strlen(a); 27 node *p=root; 28 int i; 29 for(i=0;i<l;i++) 30 { 31 if(p->next[a[i]-‘+‘]==0) 32 { 33 p->next[a[i]-‘+‘]=new node; 34 } 35 // 已存在此前缀 36 p=p->next[a[i]-‘+‘]; 37 p->count++; 38 } 39 } 40 int find(char *s) 41 { 42 struct node *p; 43 int len=strlen(s); 44 if(len==0) return 0; 45 p=root; 46 for(int i=0;i<len;i++){ 47 if(p->next[s[i]-‘+‘]!=0) 48 p=p->next[s[i]-‘+‘]; 49 else 50 return 0; 51 } 52 return p->count; 53 } 54 void de(node *p) 55 { 56 if(p==0) 57 return ; 58 int i; 59 for(i=0;i<10;i++) 60 { 61 de(p->next[i]); 62 } 63 delete p; 64 65 } 66 int main() 67 { 68 int t; 69 scanf("%d",&t); 70 char a[15],b[15]; 71 while(t--) 72 { 73 root = new node; 74 int n,m; 75 k=0; 76 scanf("%d%d",&n,&m); 77 int i; 78 for(i=0;i<n;i++) 79 { 80 scanf("%s",a); 81 insert(a); 82 } 83 for(i=0;i<m;i++){ 84 scanf("%s",b); 85 int ans=0; 86 ans=find(b); 87 printf("%d\n",ans); 88 } 89 de(root); 90 } 91 return 0; 92 }
时间: 2024-10-25 01:00:38