統計難題 hdu1251 靜態版字典樹

hdu1251

-------上午校賽正式賽啊,作爲一名大二(快大三)的人啊,居然輸出也馬虎,人家是Yes啊,我愣是寫成了YES,導致wa了11次才成功。如果不馬虎興許二等獎了,作爲一名迷茫的大二(快大三)的人是需要一點點鼓勵的啊,上大學後運氣真是差,大學這種尷尬的事情在我身上就頻繁發生大哭。。水個題先吧。。

         《統計難題》有人說這道題用字典樹G++過不了,C++能過,我用我的試了下都過了。數組要開大點500000纔好。題意:空行上面是許多個沒有重複的單詞,下面輸入字符串來判斷上面有多少個單詞是這個字符串前綴。


           本題思路就是記錄單詞中每個字母下面的節點(val[rt])共經過了多少次,不像是傳統的字典樹模板只要記錄單詞尾字母下面的尾節點即可判斷是否字典樹中是否有這個單詞。而這個題要的是前綴,而且是擁有此前綴的個數,因此稍作修改,詳見代碼。


          字典樹的意思就是先給一個根節點,然後順着這條根節點往下連接兒子節點的那條邊作爲單詞的一個字母,如果存在這個字母就下去找那個兒子節點,然後同理找下一個字母。不存在這個字母的話,根節點就再生一個兒子,然後繼續不斷地生..查找同理,字母不存在就說明沒這個單詞

本題水水代碼

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
int val[500000];
int ch[500000][26], tmp;
void insert(char *a)
{
    int rt = 0, x;
    for (int i = 0; a[i]; i++)
    {
        x = a[i] - 'a';
        if (ch[rt][x] == 0)
        {
            ch[rt][x] = ++tmp;
        }
        rt = ch[rt][x];
        val[rt]++;
    }
}

int find(char *b)
{
    int rt = 0, x;
    int ln = strlen(b);
    for (int i = 0; i < ln; i++)
    {
        x = b[i] - 'a';
        if (ch[rt][x] == 0)
        {
            return 0;
        }
        rt = ch[rt][x];
    }
    return val[rt];
}

int main()
{
     char str[20];
     tmp = 0;
     memset(ch[0], 0, sizeof (ch[0]));
     memset(val, 0, sizeof (val));
     while(gets(str),strcmp(str,""))
     insert(str);
     while (gets(str))
     {
        printf("%d\n", find(str));
     }
     return 0;
}

          


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