hdu2072單詞數 字典樹做法



HDU2072

--------剛剛校賽被學弟無情虐了一番,於是回到寢室躲到角落找個水題來緩解下心中憤悶

          《單詞數》 這題用的字典樹做的,wa了好多次,感覺後臺數據有點點問題。。 題意很簡單了,就素從一篇長文中找出有多少種單詞。。字典樹insert函數稍作修改就可以, 就是最後單詞尾節點如果從來沒被賦值成1過(就是字典樹沒添加過這個單詞)就+1;


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


本題水代碼

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;

char s[1000000+5];
char s2[1000000+5];
int ch[1000000+5][26];
int val[1000000+5], tmp, ans;
void insert(char *a)
{
    int rt = 0;
    for (int i = 0; a[i]; i++)
    {
        int c = a[i] - 'a';
        if (ch[rt][c] == 0)
        {
            val[tmp] = 0;
            //memset(ch[rt], 0, sizeof (ch[rt]));這句話去掉感覺完全沒問題
            ch[rt][c] = tmp++;
        }
        rt = ch[rt][c];
    }
    if (val[rt] == 0) ans++;
    val[rt] = 1;
}

int main()
{
    while (gets(s) && strcmp(s, "#"))
    {
        int i, j, top = 0;
        tmp = 1, ans = 0;
        val[0] = 0;
        memset(ch[0], 0, sizeof(ch[0]));
        for (i = 0; i <= strlen(s); i++)
        {
            if (s[i] >= 'a' && s[i] <= 'z')
            //如果寫成if (s[i] != ' ' && s[i] != '\0')就不行,不是說好的只有空格和小字母嗎?
            s2[top++] = s[i];
            else
            {
                if (top != 0)
                {s2[top] = '\0';
                top = 0;
                insert(s2);}
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}



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