当前位置: 代码迷 >> 综合 >> Trie树 hdu3460 Ancient Printer
  详细解决方案

Trie树 hdu3460 Ancient Printer

热度:54   发布时间:2023-12-14 03:59:54.0

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

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

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;
}