hdu(2846)Repository
2015-08-23 21:36
363 查看
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
For each query, you just output the number of the merchandises, whose names contain the search string as their substrings.
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
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;
}
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
For each query, you just output the number of the merchandises, whose names contain the search string as their substrings.
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
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;
}
相关文章推荐
- MFC学习
- Centos6.5下MySQL5.5.45数据库迁移
- CSU 1335 高桥和低桥
- Java泛型与继承的关系
- web前端:css
- android---深入了解fragment的生命周期
- 遍历二叉树的各种操作(非递归遍历)
- HDU 5056 双指针(也叫窗口滑动(也叫尺取法))
- Android(java)学习笔记192:创建sqlite数据库和创建数据库的表
- Linux的一些基本命令
- netty5学习笔记-内存池1-PoolChunk
- Length of Last Word
- netty5学习笔记-内存池1-PoolChunk
- Accelerated C++学习笔记 5 管理内存和低级数据结构
- 推荐的书单
- git 第三天 SSH免密码登录 2
- 纯CSS制作圆角矩形框知识总结
- Webview解析html源码
- 输出所有对象的属性名,并放入一个数组
- Android中JSON格式及JSON解析