總時間限制:
1000ms
記憶體限制:
65536kb
描述
乙個字串的字首是從該字串的第乙個字元起始的乙個子串。例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon"。注意到這裡我們不認為空串是字串, 但是每個非空串是它自身的字串. 我們現在希望能用字首來縮略的表示單詞。例如, "carbohydrate" 通常用"carb"來縮略表示. 現在給你一組單詞, 要求你找到唯一標識每個單詞的最短字首
在下面的例子中,"carbohydrate" 能被縮略成"carboh", 但是不能被縮略成"carbo" (或其餘更短的字首) 因為已經有乙個單詞用"carbo"開始
乙個精確匹配會覆蓋乙個字首匹配,例如,字首"car"精確匹配單詞"car". 因此 "car" 是 "car"的縮略語是沒有二義性的 , 「car」不會被當成"carriage"或者任何在列表中以"car"開始的單詞.
輸入輸入包括至少2行,至多1000行. 每行包括乙個以小寫字母組成的單詞,單詞長度至少是1,至多是20.
輸出輸出的行數與輸入的行數相同。每行輸出由相應行輸入的單詞開始,後面跟著乙個空格接下來是相應單詞的沒有二義性的最短字首識別符號。
樣例輸入
carbohydratecart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
carcarbonate
樣例輸出
carbohydrate carbohcart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
**翻譯自rocky mountain 2004
題目分析
基本可以確定是字典樹的問題(關於字典樹字典樹(字首樹))字符集大小為26個英文本母。
稍有區別的是在建樹的時候記錄當前結點訪問次數,最後輸出到訪問次數為1返回(也就是這個單詞特有的最短字首)。
#include
#include
#include
#include
const
int charset =26;
const
int maxn =
1e5+7;
struct dictree
root;
void
init
(dictree *t)
t->num =0;
}void
insert
(char s)
t = t->next[c]
; t->num++;}
}void
output
(char s)
}}intmain()
for(
int i =
0; i < cnt;
++i)
return0;
}
2797 最短字首
主要思想 1.根節點不含任何字元 2.每一層最多26個 26條路徑代表26個字母 3.從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。最基本的字典樹結構 struct trie 先序遍歷就是按字典公升序排列 字典樹 輸入同時插入 記錄字首 查詢 字首個數為1 的就是最短 incl...
1799 最短字首
總時間限制 1000ms記憶體限制 65536kb 描述 乙個字串的字首是從該字串的第乙個字元起始的乙個子串。例如 carbon 的字串是 c ca car carb carbo 和 carbon 注意到這裡我們不認為空串是字串,但是每個非空串是它自身的字串.我們現在希望能用字首來縮略的表示單詞。例...
POJ 最短路徑
這兩天做了六道最短路徑的問題,分別用了dijkstra演算法 spfa演算法和floyd演算法,甚至還有一道題用並查集做的也a了,感覺對短路徑已經學得很不錯了。poj1860,poj3259,poj1062,poj2253,poj1125,poj2240 poj2253,dijkstra和並查集都可...