1. 程式人生 > >洛谷1481魔族密碼

洛谷1481魔族密碼

題目描述

風之子剛走進他的考場,就……

花花:噹噹噹當~~偶是魅力女皇——花花!!^^(華麗出場,禮炮,鮮花)

風之子:我嘔……(殺死人的眼神)快說題目!否則……-_-###

花花:……咦好冷我們現在要解決的是魔族的密碼問題(自我陶醉:搞不好魔族裡面還會有人用密碼給我和菜蟲寫情書咧,哦活活,當然是給我的比較多拉*_*)。魔族現在使用一種新型的密碼系統。每一個密碼都是一個給定的僅包含小寫字母的英文單詞表,每個單詞至少包含1個字母,至多75個字母。如果在一個由一個詞或多個片語成的表中,除了最後一個以外,每個單詞都被其後的一個單詞所包含,即前一個單詞是後一個單詞的字首,則稱詞表為一個詞鏈。例如下面單片語成了一個詞鏈:

i int integer

但下面的單詞不組成詞鏈:

integer

intern 現在你要做的就是在一個給定的單詞表中取出一些詞,組成最長的詞鏈,就是包含單詞數最多的詞鏈。將它的單詞數統計出來,就得到密碼了。

風之子:密碼就是最長詞鏈所包括的單詞數阿……

花花:活活活,還有,看你長得還不錯,給你一個樣例吧:

輸入輸出格式

輸入格式:

這些檔案的格式是,第一行為單詞表中的單詞數N(1<=N<=2000),下面每一行有一個單詞,按字典順序排列,中間也沒有重複的單詞咧!!

輸出格式:

你要提交的檔案中只要在第一行輸出密碼就行啦^^

輸入輸出樣例

輸入樣例#1:

5
i
int
integer
intern
internet

輸出樣例#1:

4

思路:

​ 依次將每個單詞加入字典樹中,並計算建樹過程中(路徑上)節點的最大值,該節點即為【節點】.num=max(【節點】.num,【最大節點】.num+1),最後num最大的節點即位所求

程式碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct node {
    int num = 0;
    node *son[26];
};

struct tree {
    node *head;
}head;

int n;
char s[105];
int ans = 0;

void add(node *point, int ceng, int maxx, int len) {
    if (ceng == len) {
        maxx = max(maxx, point -> num);
        point -> num = maxx + 1;
        if (ans < point -> num) ans = point -> num;
        return;
    }
    int k = s[ceng] - 'a';
    maxx = max(maxx, point -> num);
    if (point -> son[k] == NULL) {
        point -> son[k] = (node *) malloc(sizeof(node));
        add(point -> son[k], ceng + 1, maxx, len);
    } else {
        add(point -> son[k], ceng + 1, maxx, len);
    }
}

void Delete(node *point) {
    for (int i = 0; i < 26; i++) {
        if (point -> son[i] == NULL) continue;
        Delete(point -> son[i]);
    }
    free(point);
}

int main () {
    scanf("%d", &n);
    head.head = (node *)malloc(sizeof(node));
    for (int i = 0; i < n; i++) {
        scanf("%s", s);
        int len = strlen(s);
        add(head.head, 0, 0, len);
    }
    printf("%d\n", ans);
    Delete(head.head);
    return 0;
}

轉載請註明出處!!!

如果有寫的不對或者不全面的地方 可通過主頁的聯絡方式進行指正,謝謝