Trie树 hdu4287 Intelligent IME

题意:告诉你手机按键对应了哪些字母,然后再告诉你一些单词

问按对应的数字对应了多少个给出的单词


思路:将单词构造成字典树,然后用对应的数字在字典树上查询

#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<iostream>
#include<functional>
#include<algorithm>

using namespace std;
typedef long long LL;
typedef pair<LL, int> PLI;

const int MX = 1e3 + 5;
const int INF = 0x3f3f3f3f;

char S[10];
vector<string>G;
char table[][10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

struct Node {
    int num;
    Node *Next[26];
    Node() {
        num = 0;
        memset(Next, NULL, sizeof(Next));
    }
};

void trie_add(Node*root, char*S) {
    int L = strlen(S);
    Node *p = root;
    for(int i = 0; i < L; i++) {
        int id = S[i] - 'a';
        if(p->Next[id] == NULL) {
            p->Next[id] = new Node();
        }
        p = p->Next[id];
    }
    p->num++;
}

int trie_query(Node*root, int pos, int L) {
    int ans = 0;
    int id = S[pos] - '0';
    for(int i = 0; i < strlen(table[id]); i++) {
        int w = table[id][i] - 'a';
        if(root->Next[w] != NULL) {
            if(pos + 1 == L) {
                ans += root->Next[w]->num;
            } else {
                ans += trie_query(root->Next[w], pos + 1, L);
            }
        }
    }
    return ans;
}


int main() {
    //freopen("input.txt", "r", stdin);
    int T, n, m;
    scanf("%d", &T);
    while(T--) {
        G.clear();
        Node *root = new Node();
        scanf("%d%d", &n, &m);

        for(int i = 1; i <= n; i++) {
            scanf("%s", S);
            G.push_back(string(S));
        }
        for(int i = 1; i <= m; i++) {
            scanf("%s", S);
            trie_add(root, S);
        }
        for(int i = 0; i < n; i++) {
            strcpy(S, G[i].c_str());
            printf("%d\n", trie_query(root, 0, strlen(S)));
        }
    }
    return 0;
}


你可能感兴趣的:(Trie树 hdu4287 Intelligent IME)