Problem Description
When you go shopping, you can search in repository for avalible merchandises by the computers and internet. First you give the search system a name about something, then the system responds with the results. Now you are given a lot
merchandise names in repository and some queries, and required to simulate the process.
 
Input
There is only one case. First there is an integer P (1<=P<=10000)representing the number of the merchanidse names in the repository. The next P lines each contain a string (it's length isn't beyond 20,and all the letters are lowercase).Then
there is an integer Q(1<=Q<=100000) representing the number of the queries. The next Q lines each contains a string(the same limitation as foregoing descriptions) as the searching condition.
 
Output
For each query, you just output the number of the merchandises, whose names contain the search string as their substrings.
 
Sample Input
20
ad
ae
af
ag
ah
ai
aj
ak
al
ads
add
ade
adf
adg
adh
adi
adj
adk
adl
aes
5
b
a
d
ad
s
 
Sample Output
0
20
11
11
2

题解:字典树,把每个字符串的字串都用字典树保存下来,而且记录下每个子串的个数,可是要注意每个字符串可能有同样的字串。此时仅仅加一次。比如ababc,ab仅仅加一次

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; struct Node
{
int id;
int num;
Node* next[26];
Node()
{
id = -1;
num = 0;
for(int i = 0;i < 26;i++)
{
next[i] = NULL;
}
}
}; Node* root; void insert(char* s,int k)
{
int len = strlen(s);
Node* p = root;
for(int i = 0;i < len;i++)
{
if(p->next[s[i] - 'a'] == NULL)
{
Node* q = new Node();
q->id = k;
q->num = 1;
p->next[s[i] - 'a'] = q;
}
p = p->next[s[i] - 'a'];
if(p->id != k)
{
p->id = k; //该字符串中该子字符已经出现了
p->num++; //该字串个数加一
}
}
} int find(char* s)
{
int len = strlen(s);
Node* p = root;
for(int i = 0;i < len;i++)
{
if(p->next[s[i] - 'a'] == NULL)
{
return 0;
}
p = p->next[s[i] - 'a'];
}
return p->num;
} void del(Node*& p)
{
for(int i = 0;i < 26;i++)
{
if(p->next[i] != NULL)
{
del(p->next[i]);
}
}
delete p;
} int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
root = new Node();
char s[100];
for(int i = 0;i < n;i++)
{
scanf("%s",s);
for(int j = 0;s[j] != '\0';j++)
{
insert(s + j,i);
}
}
int q;
scanf("%d",&q);
for(int i = 0;i < q;i++)
{
scanf("%s",s);
printf("%d\n",find(s));
}
del(root);
} return 0;
}

最新文章

  1. 与焊接厂交流——从生产角度出发的PCB设计心得
  2. python 读取全国城市aqi数据,差值生成png图片
  3. Java 数组操作
  4. Redis之七种武器
  5. mysql Partition(分区)初探
  6. 【转】K短路
  7. gauge.js的应用
  8. Java 四种线程池的使用
  9. 实现文件下载的java代码
  10. KBEngine WebConsole Guide
  11. ThinkPHP5上传图片并压缩为缩略图
  12. Java Socket:Java-NIO-ServerSocketChannel
  13. day13_H5_CSS_2
  14. vue版 弹幕
  15. 《笨方法学Python》加分题20
  16. 自动化测试的Selenium的python版安装与使用
  17. 用a标签实现submit提交按钮的效果
  18. python循环语句详细讲解
  19. SOA&amp;微服务&amp;服务网格&amp;高可用
  20. sysfs_create_group创建sysfs接口

热门文章

  1. springmvc-servlet.xml(springmvc-servlet.xml 配置 增强配置)
  2. 前端学习笔记-HTML(一)
  3. ACM 手机短号问题
  4. Outlook2010规则:尝试操作失败,找不到某个对象
  5. 异常及String
  6. opengl渲染时画面抖动
  7. java 1.8 内存告警问题
  8. 【前端】CSS隐藏元素的方法和区别
  9. Nginx配置udp/tcp代理
  10. 嵌入式 ThriftServer in Spark