NYoj 685 查找字符串

描述

小明得到了一张写有奇怪字符串的纸,他想知道一些字符串出现了多少次,但这些字符串太多了,他想找你帮忙,你能帮他吗?输入字符包括所有小写字母、‘@’、‘+’。

 
输入
第一行包含一个整数T(T<=100).表示测试数据组数。
接下来每组数据第一行包含两个整数n,m(n,m<100000),分别表示有n个字符串,小明要问你m次。
接下来n行,每行包含一个字符串,长度不大于15。
接下来m行,每行包含一个字符串,表示小明要问该串出现的次数。
输出
输出每组小明询问数串出现的次数。
样例输入
1
5 3
hello
it@is+so@easy
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
",ans);
88         }
89         de(root);
90     }
91     return 0;
92 }
原文地址:https://www.cnblogs.com/wangmengmeng/p/5013929.html