描述
乙個字串的字首是從該字串的第乙個字元起始的乙個子串。例如 "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 carbohcart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
貪心考慮先按字典序排序,然後逐個將單詞與前後的作比較,直到找到所求最短字首。
先貼**
#includeusingnamespace
std;
struct
modea[
1010
];bool
cmp1(mode x,mode y)
return lx}bool
cmp2(mode x,mode y)
intmain()
int sum=i-1
; sort(a+1,a+sum+1
,cmp1);
for( i = 1 ; i <= sum ; ++i)
if(a[i].w[j]!=a[i+1
].w[j])
if(!flag1&&!flag2)break
; }
if(j==l)--j;
for(int k = 0 ; k <= j ; ++k )a[i].z[k]=a[i].w[k];
}sort(a+1,a+sum+1
,cmp2);
for(int i = 1 ; i <= sum ; ++i)
return0;
}
需要注意的是,在比較前與後時不能用如下判斷:
for( i = 1 ; i <= sum ; ++i)}
比如:abct
abcxt
abext
第二個的最短為abcx,若用如上方法判斷會得到abcxt。
所以需要開兩個flag,當上下兩個都為false時,就找到了字首的尾。(特別鳴謝馬哥出了這個資料,畢竟自己調了好久也沒發現這個錯誤qaq)
就是這樣了。
01字典樹 貪心(順便總結字典樹模板)
題目大意 題意 給你n個數,然後給你m組詢問,每組詢問給你乙個數,輸出n個數中與該數亦或 的最大的那個數,輸出的是被亦或的那個數,不是亦或後的結果。給你n個數,然後給你m組詢問,每組詢問給你乙個數,輸出n個數中與該數亦或 的最大的那個數,輸出的是被亦或的那個數,不是亦或後的結果。思路 我用的是字典樹...
01字典樹,貪心 CF1285D
題目大意 給你n n 1 e5 n leq1e5 n 1e 5 個整數.讓你確定乙個整數x最小化 max max max 題目思路 二進位制從高位到低位考慮.當第i ii位同時存在 0 和 1 時,貢獻恒為2i2 2i.這一位放0 1就只需要考慮另一半的值了.例如 x的第i ii位放0.那麼那些 本...
2018 8 11T1(貪心,基環樹)
描述 有 n 座城市,其中編號為 1 的是首都。城市之間只能通過單向的傳送器進行移動。每座城市有且僅有乙個傳送器,第 i 個城市的傳送器指向城市 ai。保證從任意城市出發,經過若干次傳送,都能到達首都。小a喜歡 k 這個數,他想讓你修改一些城市的傳送器,使得從每個城市出發,走恰好 k 步後都能恰好停...