hdu1251解题报告

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章