Trie树 hdu3460 Ancient Printer

来源:互联网 发布:网络电子游戏官网 编辑:程序博客网 时间:2024/04/30 13:34

大概的意思就是模拟输入顺序,,然后最少要按多少次键

仔细分析一下题目就可以发现:

1.输出的次数就等于n

2.如果建一个Trie树,因为最后可以保留一个单词而没必要删除它,所以除了这个单词的节点只被输入了,其他的节点都被输入了一次,和删除了一次

所以就能得到答案  Trie树节点数*2-最长单词长度+n

#include<map>#include<set>#include<cmath>#include<queue>#include<cstdio>#include<string>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<functional>using namespace std;typedef long long LL;typedef pair<int, int> PII;const int MX = 5e5 + 5;const int TX = 5e5 + 5;const int INF = 0x3f3f3f3f;struct Node {    int num;    int Next[26];    Node() {        memset(Next, 0, sizeof(Next));    }} node[TX];int T_rear;int trie_node() {    node[++T_rear] = Node();    return T_rear;}void trie_add(int root, char*S) {    int L = strlen(S);    int p = root;    for(int i = 0; i < L; i++) {        int id = S[i] - 'a';        if(!node[p].Next[id]) {            node[p].Next[id] = trie_node();        }        p = node[p].Next[id];    }    node[p].num++;}int main() {    int n; char S[100];    while(~scanf("%d", &n)) {        T_rear = 0;        int Max = 0;        int root = trie_node();        for(int i = 1; i <= n; i++) {            scanf("%s", S);            Max = max(Max, (int)strlen(S));            trie_add(root, S);        }        printf("%d\n", n + (T_rear - 1) * 2 - Max);    }    return 0;}


0 0
原创粉丝点击