您的位置:首页 > 其它

Trie树 hdu3460 Ancient Printer

2015-08-09 20:45 288 查看
大概的意思就是模拟输入顺序,,然后最少要按多少次键

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: