HDU 1251 统计难题 【字典树模板题】

传送门
// 中文题意不多BB. 就是输入有点难处理….
而且他并没有告诉我们单词的数量, 所以范围需要开到4e5才能过, 然后用map直接标记按理说是很有可能T的, 但是这道题的数据有问题, map可以水过, 但是正解是字典树, 所以我们还是要学习正解呀….
像这种在许多串中统计前缀(后缀), 等数量的一般都是用字典树…..

AC Code

const int maxn = 4e5+5;
struct Trie {
    int num, nex[26];
}trie[maxn];
int idx;
void Trie_insert(string& s)
{
    int x = 0;
    for(int i = 0 ; i < sz(s) ; i ++) {
        int k = s[i]-'a';
        if(!trie[x].nex[k])
            trie[x].nex[k] = ++idx;
        x = trie[x].nex[k];
        trie[x].num++;
    }
}
int Trie_find(string& s) {
    int x = 0;
    for(int i = 0 ; i < sz(s) ; i ++) {
        int k = s[i]-'a';
        x = trie[x].nex[k];
        if (!x) return 0;
    }
    return trie[x].num;
}
void solve() {
    string s; Fill(trie, 0);
    while(getline(cin, s)) {
        if (sz(s) <= 0) break;
        Trie_insert(s);
    }
    while(cin >> s) {
        cout << Trie_find(s) << endl;
    }
}

map水过的~~~

map<string,int>mp;
int main()
{
    char s[15];
    while(gets(s)){
        if(strlen(s) == 0)
            break;
        for(int i=strlen(s);i>0;i--){
            s[i] = '\0';  //把最后一个字符替换成结束符号.
            mp[s]++;
        }
    }
    while(gets(s)){
        printf("%d\n",mp[s]);
    }
}

你可能感兴趣的:(字典树/01字典树)