1799 最短字首

2021-09-21 15:24:02 字數 1559 閱讀 3446

總時間限制: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.

輸出輸出的行數與輸入的行數相同。每行輸出由相應行輸入的單詞開始,後面跟著乙個空格接下來是相應單詞的沒有二義性的最短字首識別符號。

樣例輸入

carbohydrate

cart

carburetor

caramel

caribou

carbonic

cartilage

carbon

carriage

carton

carcarbonate

樣例輸出

carbohydrate carboh

cart cart

carburetor carbu

caramel cara

caribou cari

carbonic carboni

cartilage carti

carbon carbon

carriage carr

carton carto

car car

carbonate carbona

**翻譯自rocky mountain 2004

【思路】

暴力列舉:i列舉字串,j列舉i串的字首,k列舉所有字串判斷是否為字首。時間複雜度o(m*n^2),其中n是字串個數,m是字串長度。

假如測試資料真的達到極限:1000*1000*20,這個演算法只能得部分測試點的分。

**如下:

1 #include2 #include34

char str[1005][23];5

6int main(int argc, char *ar**)729

}30if(f==1) 31}

32if(j>len) printf("

%s %s\n

",str[i],str[i]);33}

34return0;

35 }

網上資料:可以用字典樹解決,這個留待以後研究吧。

參考:

2797 最短字首

主要思想 1.根節點不含任何字元 2.每一層最多26個 26條路徑代表26個字母 3.從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。最基本的字典樹結構 struct trie 先序遍歷就是按字典公升序排列 字典樹 輸入同時插入 記錄字首 查詢 字首個數為1 的就是最短 incl...

貪心 字典樹openjudge1799 最短字首

描述 乙個字串的字首是從該字串的第乙個字元起始的乙個子串。例如 carbon 的字串是 c ca car carb carbo 和 carbon 注意到這裡我們不認為空串是字串,但是每個非空串是它自身的字串.我們現在希望能用字首來縮略的表示單詞。例如,carbohydrate 通常用 carb 來縮...

POJ2797 最短字首

總時間限制 1000ms 記憶體限制 65536kb 描述 乙個字串的字首是從該字串的第乙個字元起始的乙個子串。例如 carbon 的字串是 c ca car carb carbo 和 carbon 注意到這裡我們不認為空串是字串,但是每個非空串是它自身的字串.我們現在希望能用字首來縮略的表示單詞。...