kmp bzoj3620 似乎在夢中見過的樣子

2022-05-20 03:36:51 字數 1204 閱讀 2030

考察kmp理解題

「madoka,不要相信 qb!」伴隨著 homura 的失望地喊叫,madoka 與 qb 簽訂了契約.

這是 modoka 的乙個噩夢,也同時是上個輪迴中所發生的事.為了使這一次 madoka 不再與 qb簽訂契約,homura 決定在剛到學校的第一天就解決 qb.然而,qb 也是有許多替身的(但在第八話中的劇情顯示它也有可能是無限重生的),不過,意志堅定的 homura 是不會放棄的——她決定

消滅所有可能是 qb 的東西.現在,她已感受到附近的狀態,並且把它轉化為乙個長度為 n 的字串交給了學 oi 的你.

現在你從她的話中知道 , 所有形似於 a+b+a 的字串都是 qb 或它的替身 , 且len(a)>=k,len(b)>=1 (位置不同其他性質相同的子串算不同子串,位置相同但拆分不同的子串算同一子串),然後你必須盡快告訴 homura 這個答案——qb 以及它的替身的數量.

第一行乙個字串,第二行乙個數 k

僅一行乙個數 ans,表示 qb 以及它的替身的數量

【樣例輸入 1】

aaaaa

1【樣例輸入 2】

abcabcabc

2【樣例輸出 1】

6【樣例輸出 2】

8對於 100%的資料:n<=15000 , k<=100,且字符集為所有小寫字母

由於起點不固定,那麼相當於是做$n$次kmp。為方便起見,以下的題解只討論第一次kmp的情況。

考慮子串$[1,i]$若存在貢獻,那麼$fail[i]$一直向上的路徑上必定存在節點$j$使得$fail[j]

那麼每一次暴力向上跳來檢查是否合法。時間複雜度$o(n^3)$

把$fail$視作樹形結構。由於這個結構的更新是自頂向下的,就可以順帶維護乙個路徑上大於等於$k$的最短字首長度。時間複雜度$o(n^2)$

1 #include2

const

int maxn = 15003;3

const

int inf =1e9;45

char

s[maxn];

6int

k,fail[maxn],mn[maxn],n,ans;78

intmain()927

}28 printf("

%d\n

",ans);

29return0;

30 }

end

3620 似乎在夢中見過的樣子 Kmp 暴力

說白了其實就是暴力.暴力列舉左端點然後跑一邊kmp然後列舉右端點判斷 如果匹配的串超過了當前列舉的長度的一半就讓指標一直往前跑.然後統計答案 include include include include include include include include include include...

bzoj3620 似乎在夢中見過的樣子

亂點點到了這題。然後fyc巨巨說他以前用的是exkmp。於是我就學稍微學了一下。然後學著學著感覺沒什麼用 然後就放棄了。發現這題大家都是暴力 kmp 其實真的很暴力 你就列舉乙個左端點。然後對於這個左端點,我們對後面的字串跑一次kmp 然後呢,再列舉乙個右端點,判斷行不行。其實呢就還是按kmp的ne...

BZOJ3620 似乎在夢中見過的樣子

time limit 15 sec memory limit 128 mb submit 1361 solved 796 madoka,不要相信 qb!伴隨著 homura 的失望地喊叫,madoka 與 qb 簽訂了契約.這是 modoka 的乙個噩夢,也同時是上個輪迴中所發生的事.為了使這一次 ...