1. 程式人生 > >百練OJ:2797最短前綴

百練OJ:2797最短前綴

包括 == art 我們 第一個字符 好用 else class 暴力

剛開始找輸入的退出方式死也沒找著,原來這並不是個問題,上網看了一下有人直接這麽寫的

while( scanf( "%s", input[ temp ++]) != EOF );
輸入完成後 通過輸入一行Ctrl+Z再回車退出就行了,有人說用字典樹,我不熟悉,直接暴力求解的,就是對於每一個輸入的單詞,從短到長把他的子串弄出來,依次判斷是不是其他單詞的子串,如
果都不是,那就可以退出循環了;如果是,那證明這時的子串還不能代表本身,還要再長一些。用到的關鍵兩個函數是strstr,判斷是否是子串,和strncpy,復制n個字符到目的地址。另外,C++的new
很好用,可用於臨時開辟一段空間,只是用完別忘了刪除。
描述
一個字符串的前綴是從該字符串的第一個字符起始的一個子串。例如 "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
car
carbonate
樣例輸出
carbohydrate carboh
cart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
 
 1 #include <cstdio>
 2
#include <cstring> 3 using namespace std; 4 char buf[1000][21]; 5 int main() 6 { 7 unsigned int idx=0,i,j,n; 8 while(scanf("%s",buf[idx++])!=EOF); 9 idx--; 10 for(i=0;i<idx;i++){ 11 char *p=new char[22]; 12 for(n=1;n<=strlen(buf[i]);n++){ 13 strncpy(p,buf[i],n);
14 p[n]=\0; 15 for(j=0;j<idx;j++){ 16 if(j!=i){ 17 if(strstr(buf[j],p)==buf[j]) 18 break; 19 } 20 } 21 if(j<idx) 22 continue; 23 else 24 break; 25 } 26 printf("%s %s\n",buf[i],p); 27 delete []p; 28 } 29 return 0; 30 }

百練OJ:2797最短前綴