题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2846
题解:
字典树变形(注意要交C++,不然会爆内存。。。。。。)
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f;
const int maxn = 27;
struct Tire
{
Tire *next[maxn];
int cnt;
int id;
Tire(){
cnt=0;
id=-1;
for(int i=0;i<maxn;i++)
next[i]=NULL;
}
}root;
int n,m;
void create(char *s,int ID)
{
int k = 0;
Tire *p = &root;
while(s[k]!='\0')
{
int pos=s[k]-'a';
if(p->next[pos]==NULL)
p->next[pos]=new Tire;
p=p->next[pos];
if(p->id!=ID)
p->cnt++;
p->id=ID;
k++;
}
}
int search(char *s)
{
int k = 0;
Tire *p = &root;
while(s[k]!='\0'&&p->next[s[k]-'a'])p=p->next[s[k++]-'a'];
return s[k]=='\0'?p->cnt:0;
}
int main()
{
char s[35];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
int len=strlen(s);
for(int j=0;j<len;j++)
create(s+j,i);
}
scanf("%d",&m);
while(m--)
{
scanf("%s",s);
printf("%d\n",search(s));
}
return 0;
}