題意:給出N個由小寫字母組成的隊名,用一台古老的打印機這些隊名打印出來,問最少要敲幾次鍵盤(隊名之間不用按輸入順序),這台打印機只能執行以下3種操作:
1.在現有基礎上的末尾繼續輸入小寫字母;
2.刪除最後一個字母;
3.打印現有串。
(1 <= N <= 10000, 隊名長度 <= 50)
——>>組織好Trip,記錄總結點數sz,每個結點到根結點的距離,得到距離根結點最遠的結點的距離Max,那麼答案為2 * sz + N - Max。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxw = 50 + 10;
int N;
char name[maxw];
struct node{
int dis;
node *next[26];
node(){
dis = 0;
memset(next, 0, sizeof(next));
}
};
struct Trip{
node *root;
int Max;
int sz;
Trip(){
root = new node;
Max = -1;
sz = 0;
}
int idx(char c){
return c - 'a';
}
void insert(char *s){
node *t = root;
int len = strlen(s), i;
for(i = 0; i < len; i++){
int c = idx(s[i]);
if(!t->next[c]){
t->next[c] = new node;
sz++;
}
t->next[c]->dis = t->dis + 1;
t = t->next[c];
}
Max = max(Max, t->dis);
}
void solve(){
printf("%d\n", 2 * sz + N - Max);
}
};
int main()
{
while(scanf("%d", &N) == 1){
Trip trip;
for(int i = 0; i < N; i++){
scanf("%s", name);
trip.insert(name);
}
trip.solve();
}
return 0;
}