BZOJ3670 動物園(KMP演算法)

2021-08-14 15:24:53 字數 2708 閱讀 2612

bzoj

神tm閱讀理解題

看完題目之後

想暴力:

搞個倍增陣列來跳ne

xt每次暴跳ne

xt複雜度o(

tnlo

gn)

算一下,感覺複雜度差不多呀

很果斷的交了一發

然後80

分。。。

暴力**送上:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mod 1000000007

char s[1200000];

int nt[1200000];

int jp[1200000][21];

int main()

for(int j=1;j<20;++j)

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

jp[i][j]=jp[jp[i][j-1]][j-1];

int ans=1;

for(int i=2;i<=l;++i)

printf("%d\n",ans);

}return

0;}

然後我很不爽

把倍增陣列的兩維反了過來,防止反覆橫跳

然後我就ac

了???

又一次感受到玄學強大的力量 這個

o(tn

logn

) 的複雜度果然很對呀。。。

暴力能ac???:

(bzoj上都能ac???)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mod 1000000007

char s[1200000];

int nt[1200000];

int jp[21][1200000];

int main()

for(int j=1;j<20;++j)

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

jp[j][i]=jp[j-1][jp[j-1][i]];

int ans=1;

for(int i=2;i<=l;++i)

printf("%d\n",ans);

}return

0;}

經歷了這麼滑稽的事情

還是想想有沒有更加好的複雜度。。。

考慮記錄乙個陣列cn

t[i]

表示從i 位置最多能夠往前跳的次數

很明顯的,cn

t[i]

=cnt

[nex

t[i]

]+1

現在,我們只需要知道每乙個位置能夠跳到**就行了

還是最簡單的暴力

每次從當前位置

i 開始,暴力向前跳到k直到

k∗2<

i 為止,然後答案累乘cn

t[k]

+1看起來每次暴跳的時間複雜度不太能夠接受

最壞可以打到o(

n2)

但是考慮ne

xt陣列是怎麼求出來的

每次沿著前乙個字元的ne

xt跳

直到找到乙個合法的位置

因此,我們模仿這個過程

假設上乙個字元跳到了k

那麼,當前位置最多跳到k+

1 很容易證明

假設當前位置跳到了乙個合法的位置k′

那麼,當前位置的前乙個位置,必定可以跳到乙個合法位置k′

−1

所以,我們只需要類似km

p ,每次利用上一次求出來的

k 接著跳就行了

這樣的時間複雜度近似o(

n)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define rg register

#define mod 1000000007

char s[1200000];

int nt[1200000];

int cnt[1200000];

int main()

cnt[1]=1;

rg int ans=1;

for(rg int i=2;i<=l;++i)cnt[i]=cnt[nt[i]]+1;

for(rg int i=2,k=0;i<=l;++i)

printf("%d\n",ans);

}return

0;}

BZOJ3670 動物園 擴充套件KMP

先用擴充套件kmp求出si n si.n 與s s 的lcpne xti role presentation style position relative nex tine xti。考慮每個字尾si n si.n 的所有字首si k si.k 對numk n um k的貢獻,有貢獻的 k k 顯然...

BZOJ3670動物園 KMP變形

description 近日,園長發現動物園中好吃懶做的動物越來越多了。例如企鵝,只會賣萌向遊客要吃的。為了整治動物園的不良風氣,讓動物們憑自己的真才實學向遊客要吃的,園長決定開設演算法班,讓動物們學習演算法。某天,園長給動物們講解kmp演算法。園長 對於乙個字串s,它的長度為l。我們可以在o l ...

洛谷2375 BZOJ 3670動物園題解

題目鏈結 洛谷鏈結 我們發現題目要我們求的num i 東西本質上其實是 求有多少以i結尾的非字首且能與字首匹配的字串,而且要求字串長度小於 i 2 我們先不考慮字串長度的限制,看所有以i結尾的非字首且能與字首匹配的字串如何計數 考慮到kmp演算法的next陣列求解的過程,大家應該都想到i結尾的非字首...