hdu2846 Repository
2016-02-04 18:26
309 查看
Repository
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3735 Accepted Submission(s): 1366
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
Source
2009 Multi-University Training Contest 4 - Host
by HDU
Recommend
gaojie | We have carefully selected several similar problems for you: 2852 2847 2845 2850 2851
解析:对于一个长度为len的单词,将其子串[k,len)(0<=k<len)存入字典树,v[i]记录经过 i 节点的次数,对于每个单词,v[i]只记录一次。
注意这种数据:
2
sdasda
dadad
1
asdasa
代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6;
const int max_len=20;
int num,f[maxn][26];
int flag[maxn],v[maxn];
char s[max_len+5];
int main()
{
//freopen("1.in","r",stdin);
int n,i,j,k,x,len;
scanf("%d",&n);
for(x=1;x<=n;x++)
{
scanf("%s",s),len=strlen(s);
for(k=0;k<len;k++)
for(i=0,j=k;j<len;j++)
{
if(f[i][s[j]-'a']==0)f[i][s[j]-'a']=++num;
i=f[i][s[j]-'a'];
if(flag[i]!=x)flag[i]=x,v[i]++;
}
}
scanf("%d",&n);
while(n--)
{
scanf("%s",s),len=strlen(s);
for(i=f[0][s[0]-'a'],j=1;i&&j<len;i=f[i][s[j++]-'a']);
printf("%d\n",(j<len)?0:v[i]);
}
return 0;
}
相关文章推荐
- crlf漏洞和XSS攻击
- MFC读写固定格式的txt文档+生成目录等
- crlf漏洞和XSS攻击
- php调用kindedit富文本编辑器。
- Xcode命令行作用
- hdu 2899 Strange fuction
- codeforces 86D D. Powerful array
- 过年回家的生活
- 深度优先算法--打印数组全排列
- 在以单链表表示的正整数的有序集合上,实现集合的并、交和差运算
- IE11 上的3个bug
- 杭电1213
- C语言实现哈夫曼编码
- C++判断一个数是否为整数
- 如何成为优秀的Java程序员
- maven项目,在spring中整合mybatis
- hihocoder-1032 最长回文子串(Manacher)
- 杭电1232
- Listview的使用
- 在android style.xml文件中使用自定义属性