有時候程式設計師有很奇怪的方法來隱藏他們的口令。binny會選擇乙個字串s(由n個小寫字母組成,5<=n<=5,000,000),然後他把s順時針繞成乙個圈,每次取乙個做開頭字母並順時針依次取字母而組成乙個字串。這樣將得到一些字串,他把它們排序後取出第乙個字串。把這個字串的第乙個字母在原字串中的位置-1做為口令。
如字串alabala,按操作的到7個字串,排序後得:
aalabal
abalaal
alaalab
alabala
balaala
laalaba
labalaa
第乙個字串為aalabal,這個a在原字串位置為7,7-1=6,則6為口令。
第一行:乙個數:n
第二行開始:字串:s(每72個字元乙個換行符)
一行,為得到的口令
7anabana
題目滿足:
30%的資料n<=10000
70%的資料n<=100000
100%的資料n<=5000000
暴力的做法很好想。為了貪心,我們要保證每一位最小,就是每次用乙個位置與當前最優的位置進行比較,如果相同就不斷比較之後的字元,否則就可以更新最優解或繼續往下列舉。
但這樣顯然會超時。仔細分析過程可以發現,我們可以如下來設計:
對於這個字串,我們定義兩個指標分別為 i 和 j 分別指向 『a』 和 』n』 即 i = 0 j = 1 再定義乙個累加器 k 則表示分別以 i 和 j 為首的字串的第 k 個字元.根據貪心思想,每一項顯然要選最小的最好。在這裡 』n』 的字典序大於 』a』 那麼j顯然不會是我們所要的答案那麼我們就對j進行移位即 j++接下來我們便重複上面的操作
因為 i 和 j 所指的值是相同的,所以我們並不能通過比較這一位從而得出這兩個字串的順序關係所以我們就要對 k 進行移位即 k++。我們對 i+k 和 j+k 所指的字元進行比較,顯然可以得出 』b』 是比 』n』 要更優的那麼這時候我們就要對i進行移位,因為在 [i ,i+k) 內我們都已經判斷完了,那麼我們就可以將 i 移到 i+k+1 繼續接下來的判斷。
但是我們還要考慮以下幾個問題
解決方法如下:
#include #include #define n 5000002
using namespace std;
int n,i,j=1,k;
char c[n];
int main()
cout<
return 0;
}
題解 洛谷P1738 洛谷的資料夾
一 目錄概覽 二 題目大意 三 大致思路 四 實現 五 剖析 六 總結回顧 kkksc03想好了很多應該有的資料夾路徑名。問題是,需要是使這些資料夾都存在,需要新建幾個資料夾呢?資料夾路徑是什麼?例如 a b c,表示在根目錄下有a資料夾,在a資料夾裡有b資料夾,在b資料夾裡有c資料夾。其他路徑同理...
洛谷P1738 洛谷的資料夾 Trie
給出nn 個目錄位址,為了使這些資料夾都存在,需要新建幾個資料夾?一眼看上去就是tri etri e。雖然暴力可過。這道題其實就是不用查詢的tri etri e。直接每次輸出這棵樹的節點數量就可以了。每次找到這個目錄的下乙個 取出這乙個資料夾的名稱,再在當前已找到的節點上尋找是否有這個資料夾,如果有...
洛谷P1803凌亂的yyy
快noip了,yyy很緊張!現在各大oj上有n個比賽,每個比賽的開始 結束的時間點是知道的。yyy認為,參加越多的比賽,noip就能考的越好 假的 所以,他想知道他最多能參加幾個比賽。由於yyy是蒟蒻,如果要參加乙個比賽必須善始善終,而且不能同時參加2個及以上的比賽。輸入格式 第一行是乙個整數n 接...