51nod1554 歐姆諾姆和項鍊 kmp

2021-08-17 03:19:54 字數 1361 閱讀 5254

有一天,歐姆諾姆發現了一串長度為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」)。

這種題看著就像kmp啊,但還是不會怎麼做。看了題解,又想了挺久才明白。當n%

(n−n

ext[

n])=

0 n%(

n−ne

xt[n

])=0

的時候,設t=

n÷(n

−nex

t[n]

) t=n

÷(n−

next

[n])

,若t÷

k>=t%

k t÷k

>=t%

k,為什麼一定存在一組解?設迴圈節為

s s

,最後剩下

x' role="presentation" style="position: relative;">xx個

s s

,那麼可以從前面的

k' role="presentation" style="position: relative;">k

k組中個拿

x x

個s' role="presentation" style="position: relative;">s

s,那麼就可以構造出一組合法的解了,對於另外一種情況也類似。

#include

using

namespace

std;

#define ll long long

#define pa pair

const

int maxn=1000010;

const

int inf=2147483647;

int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return x*f;

}int n,k,next[maxn];char s[maxn];

int main()

for(int i=1;i<=n;i++)

if(i%(i-next[i])==0)

else

}

51nod1554 歐姆諾姆和項鍊

1554 歐姆諾姆和項鍊 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有一天,歐姆諾姆發現了一串長度為n的寶石串,上面有五顏六色的寶石。他決定摘取前面若干個寶石來做成乙個漂亮的項鍊。他對漂亮的項鍊是這樣定義的,現在有一條項鍊s,當s a ...

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可能是空串...