描述
小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。
- 输入
- 第一行包含一个整数T(T<=100).表示测试数据组数。 接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。 接下来n行,每行包含一个字符串,长度不大于15。 接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。 输出
- 输出每组小明询问数串出现的次数。 样例输入
-
15 3helloit@is+so@easyhelloibelieveicanachellohelloicannotacitGiveup
样例输出 -
300 题解:水题,就是多判断了“+”,“@”的情况,修改一下模板即可。 代码:
1 #include
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 using namespace std;11 12 13 struct node14 {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 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 next[s[i]-'+']!=0)48 p=p->next[s[i]-'+'];49 else50 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