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));
}


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