hdu1251解题报告

来源:互联网 发布:淘宝怎么批量发布宝贝 编辑:程序博客网 时间:2024/05/17 22:02

题目大意:给一个单词表,再给一个前缀表,问每个前缀在单词表中出现的次数?

解题思路:前缀树,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));}


0 0
原创粉丝点击