您的位置:首页 > 其它

hdu1251解题报告

2015-10-19 22:12 190 查看
题目大意:给一个单词表,再给一个前缀表,问每个前缀在单词表中出现的次数?

解题思路:前缀树,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));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: