51nod1554 歐姆諾姆和項鍊

2021-08-18 07:37:36 字數 1470 閱讀 2300

1554 歐姆諾姆和項鍊

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

有一天,歐姆諾姆發現了一串長度為n的寶石串,上面有五顏六色的寶石。他決定摘取前面若干個寶石來做成乙個漂亮的項鍊。

他對漂亮的項鍊是這樣定義的,現在有一條項鍊s,當s=a+b+a+b+a+...+a+b+a的時候是漂亮的,這兒a,b是一些寶石串,「+」表示連線操作。s中有k+1個a和k個b組成。a和b可能是空串。

現在給出寶石串,問怎麼切前幾個才能得到乙個漂亮的寶石項鍊。他切下來之後不會改變寶石的順序。

樣例解釋:

在這個樣例中前6個可以組成漂亮的串( a="", b="bca")。前7個也可以(a="b", b="ca")。

input

單組測試資料。

第一行有兩個整數n, k (1≤n,k≤1 000 000),表示寶石串原始的長度和在上文中提到的引數k。

第二行有n個由小寫字母組成的串,表示原始寶石串。

output

輸出一行有n個01組成的字串。第i(1≤i≤n)個位置是1的時候表示前i個寶石可以組成漂亮的寶石項鍊。
input示例

樣例輸入1

7 2bcabcab

output示例

樣例輸出1

0000011

題解:了解一下。

首先利用kmp的next陣列的性質,可以求出1~i的迴圈節長度

設i點為當前點,每個迴圈節為s,那麼一共有兩種情況

1:迴圈節可以完全把1~i覆蓋,即ssss...ss的情況

然後開始考慮在這麼多迴圈節中選k+1個a,k個b

因為一定要選k個ab

計算出每個ab串中含有 i / ( i - next[i] ) / k 個s,最後會剩下 i / ( i - next[i] ) % k 個s,

剩下s的個數<=每個ab中含有的s個數,則可以被覆蓋(將剩下的s看做a,此時就有了k+1個a,k個b)

如果剩下s的個數》每個ab中含有的s個數,此時i就不能被覆蓋,因為還沒到i,就選夠了所需的k~k+1個

2:迴圈節不能完全把1~i覆蓋,ssss...st的情況,t為s的乙個字首

此時只有k+1個a個k個b的情況,因為多了個額外的t串

那麼a一定=t,其餘過程都和上面一樣,但注意一點,最後的 剩下s的個數需《每個ab中含有的s個數

這時為什麼不能=了?因為之前的最後沒有t,=的情況,可以吧a看做剩下的s,而現在有了t,剩下的s+t則大於原本的迴圈節了

**(此題有毒,用另外的標頭檔案過不去,會炸時限):

#includeusing namespace std;

int n,m,nex[1000001];

char s[1000001];

void getnext()

}

51nod1554 歐姆諾姆和項鍊 kmp

有一天,歐姆諾姆發現了一串長度為n的寶石串,上面有五顏六色的寶石。他決定摘取前面若干個寶石來做成乙個漂亮的項鍊。他對漂亮的項鍊是這樣定義的,現在有一條項鍊s,當s a b a b a a b a的時候是漂亮的,這兒a,b是一些寶石串,表示連線操作。s中有k 1個a和k個b組成。a和b可能是空串。現在...

51nod 1554 歐姆諾姆和項鍊 題解

給定乙個長度為n 1 e6 n 1e6 n 1 e6 的字串s ss,和乙個k 1 e6 k 1e6 k 1 e6 定義乙個字串是漂亮的,當且僅當它珂以表示為恰好k 1 k 1k 1個aa a中間夾著k kk個b bb,a,b a,ba,b為任意字串 珂以為空 對於s ss的每個字首,求它是否是漂亮...

51nod 1554 歐姆諾姆和項鍊 題解

題目 有一天,歐姆諾姆發現了一串長度為n的寶石串,上面有五顏六色的寶石。他決定摘取前面若干個寶石來做成乙個漂亮的項鍊。他對漂亮的項鍊是這樣定義的,現在有一條項鍊s,當s a b a b a a b a的時候是漂亮的,這兒a,b是一些寶石串,表示連線操作。s中有k 1個a和k個b組成。a和b可能是空串...