洛谷1481魔族密碼
阿新 • • 發佈:2019-01-01
題目描述
風之子剛走進他的考場,就……
花花:噹噹噹當~~偶是魅力女皇——花花!!^^(華麗出場,禮炮,鮮花)
風之子:我嘔……(殺死人的眼神)快說題目!否則……-_-###
花花:……咦好冷我們現在要解決的是魔族的密碼問題(自我陶醉:搞不好魔族裡面還會有人用密碼給我和菜蟲寫情書咧,哦活活,當然是給我的比較多拉*_*)。魔族現在使用一種新型的密碼系統。每一個密碼都是一個給定的僅包含小寫字母的英文單詞表,每個單詞至少包含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; }
如果有寫的不對或者不全面的地方 可通過主頁的聯絡方式進行指正,謝謝