題目大意:給一個單詞表,再給一個前綴表,問每個前綴在單詞表中出現的次數?
解題思路:前綴樹,Trie,字典樹,每個結點記錄插入單詞時經過這個結點的次數。
注意點:沒說單詞的最長的長度,使用靜態結構的話開5000005個結點應該夠,動態結構則可以忽略這個問題。
ac代碼如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5000005;
const int sigma_size=26;
int ch[maxn][sigma_size];
int val[maxn];
int sz;
int idx(char c){ return c-'a'; }
void Insert(char *s)
{
int u=0;
int n=strlen(s);
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=1;
ch[u][c]=sz++;
}
else
{
val[ch[u][c]]++;
}
u=ch[u][c];
}
}
int query(char *s)
{
int u=0;
int n=strlen(s);
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
return 0;
}
if(i==n-1)
{
return val[ch[u][c]];
}
u=ch[u][c];
}
}
int main()
{
//freopen("1.txt","r",stdin);
char String[30];
sz=1;
memset(ch[0],0,sizeof(ch[0]));
while(gets(String)&&String[0]!='\0') Insert(String);
while(gets(String)) printf("%d\n",query(String));
}