程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu - 3460 - Ancient Printer

hdu - 3460 - Ancient Printer

編輯:C++入門知識

題意:給出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;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved