superoj779 檸檬的密碼

2021-07-05 16:27:45 字數 1427 閱讀 5284

輸入資料第一行包含乙個正整數 n ,表示字串的長度。 

資料第二行包含乙個長度為 n 的字串,僅由小寫字母組成,表示需要破譯的字串。

輸出資料僅包含乙個整數,表示最長可能的密碼的長度。

輸入  [複製]

25 

orzabcdxyzefgfeqwertydcba

輸出

13

【樣例說明】 

最長的可能的密碼是「abcdefgfedcba」,長度為 13 。

lemon 選擇的 x=4

left="abcd"

right="dcba"

mid="efgfe"

a="orz"

b="xyz"

c="qwerty"

【資料範圍】 

對於 20% 的資料,滿足n<=20 

對於 40% 的資料,滿足n<=300 

對於 60% 的資料,滿足n<=2000 

對於 100% 的資料,滿足n<=100000

解析:首先對於中間的回文串,取最長一定是最優的

所以先用manacher預處理以每個點為中心的最長回文o(n)

最後一段的翻轉==開頭段

又因為c可能為空,所以用kmp預處理每個點為最後一段開頭的最長匹配v【i】

因為我們只用最優解,不需要一定以 i 結尾,所以f【i】=max(f【i-1】,v【i】)

到此,全部預處理出來了,剩下只需要列舉中心算ans了

時間複雜度o(n)

**

//manacher + kmp

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

int n;

char c[100010];

int p[100010]; //manacher

char r[100010]; //l m r

int next[100010];

int f[100010]; //kmp

int main()

}int ans=0;

k=0;

for(j=n;j>=1;j--)

next[0]=-1; //控制搜到root的next

for(j=1;j<=k;j++)

for(j=2;j<=k;j++)}}

int v=0;

int maxx=0;

for(j=1;j<=n;j++)

int dd;

v=0;

for(i=2;ians) ans=p[i]*2-1+v*2;

}cout<

南陽779 蘭州燒餅

描述 燒餅有兩面,要做好乙個蘭州燒餅,要兩面都弄熱。當然,一次只能弄乙個的話,效率就太低了。有這麼乙個大平底鍋,一次可以同時放入k個蘭州燒餅,一分鐘能做好一面。而現在有n個蘭州燒餅,至少需要多少分鐘才能全部做好呢?輸入 依次輸入n和k,中間以空格分隔,其中1 k,n 100000 輸出輸出全部做好至...

蘭州燒餅 NYOJ 779

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 燒餅有兩面,要做好乙個蘭州燒餅,要兩面都弄熱。當然,一次只能弄乙個的話,效率就太低了。有這麼乙個大平底鍋,一次可以同時放入k個蘭州燒餅,一分鐘能做好一面。而現在有n個蘭州燒餅,至少需要多少分鐘才能全部做好呢?輸入 依次輸入n和k...

nyoj779蘭州燒餅

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 燒餅有兩面,要做好乙個蘭州燒餅,要兩面都弄熱。當然,一次只能弄乙個的話,效率就太低了。有這麼乙個大平底鍋,一次可以同時放入k個蘭州燒餅,一分鐘能做好一面。而現在有n個蘭州燒餅,至少需要多少分鐘才能全部做好呢?輸入 依次輸入n和k...