今天做題有一題用瞎搞做。。發現做不了,看了下標算 最小表示法,就學了下,覺得這個好玄啊
最小表示法的用處是這樣的
比如對於字串bacda 他的迴圈同構字串分別有
bacda
acdab
cdaba
dabac
abacd
顯然,最後乙個的字典序最小,最小表示法就是要找到這個開頭的位置,在這個例子中即是 4->』a』
個人理解,這是類似於排除法的做法。
首先我們認為所有的位置都是有可能的 接下來開始排除
乙個顯然的性質是 例如說在 bababbabaa中,0~3是不可能成為最小字典序字串的開頭的,因為」babab」和」babaa」相比,不論怎麼取,在後面的字串中都可以找到更優的解。
利用這一性質,我們可以線性的推過去,從而找到最優解
於是我們構造x,y兩個指標,表示兩個可能存在答案的位置。
為了讓x!=y,初始x=0,y=1
之後往後推,列舉乙個k,找到第乙個x+k!=y+k,這個k顯然可以等於0嘛。
然後我們判斷x+k和y+k,哪個大,顯然,大的那乙個所在的區間內全部不可能是最優解,全部排除。
當k>s.length()或x或y>s.length()時,顯然有乙個區間全部排除,則答案就是x,y中的最小值
對了,乙個比較方便的寫法, 因為是迴圈同構,所以我們可以把原來的字串複製一遍,這樣就很方便了。
本人的寫法可能有些問題,求大神指出
int min(string s, int l)
return
min(x,y);
}
謎一樣的牛 樹狀陣列
有n頭奶牛,已知它們的身高為 1 n 且各不相同,但不知道每頭奶牛的具體身高。現在這n頭奶牛站成一列,已知第i頭牛前面有ai頭牛比它低,求每頭奶牛的身高。輸入格式 第1行 輸入整數n。第2 n行 每行輸入乙個整數ai,第i行表示第i頭牛前面有ai頭牛比它低。注意 因為第1頭牛前面沒有牛,所以並沒有將...
謎一樣的牛 樹狀陣列
有n頭奶牛,已知它們的身高為 1 n 且各不相同,但不知道每頭奶牛的具體身高。現在這n頭奶牛站成一列,已知第i頭牛前面有ai頭牛比它低,求每頭奶牛的身高。輸入格式 第1行 輸入整數n。第2 n行 每行輸入乙個整數ai,第i行表示第i頭牛前面有ai頭牛比它低。注意 因為第1頭牛前面沒有牛,所以並沒有將...
244 謎一樣的牛(樹狀陣列)
有n頭奶牛,已知它們的身高為 1 n 且各不相同,但不知道每頭奶牛的具體身高。現在這n頭奶牛站成一列,已知第i頭牛前面有ai 頭牛比它低,求每頭奶牛的身高。輸入格式 第1行 輸入整數n。第2 n行 每行輸入乙個整數ai 第i行表示第i頭牛前面有ai 頭牛比它低。注意 因為第1頭牛前面沒有牛,所以並沒...