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

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

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