輸入資料第一行包含乙個正整數 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...