天天看點

妮可妮可妮

【問題描述】

小 P 特别喜歡動畫 Love Live 中的角色妮可,每當他聽到妮可說“niconiconi”

時,他總會感到特别興奮,還會露出紳士般的微笑。

作為一名理論計算機科學家,小 P 開始研究“niconiconi”這種串的特點。

他發現,“niconiconi”可以拆成“ni”、“co”、“ni”、“co”、“ni”這

五部分。

對這個模型進行了抽象後,小 P 發現,任何形如 ABABA 的串都有類似的特點,

其中 A、B 為非空串,我們稱這樣的串滿足性質 P。比如“aaaaa”就滿足性質 P,

而“ababab”卻不滿足性質 P。

有了這個革命性的發現,結合他最近新學的資料結構“字尾樹”,小 P 決定

造一道題。這道題是這樣的,小 P 給你一個僅由小寫英文字母組成的串 S,你拿

到這個串之後,小 P 會問你 q 個問題,每個問題形如“S 的字尾 p 是不是滿足性

質 P 的串呀”。

注:設 S 的長度為 n,那麼 S[1..n]的字尾 p 就是子串 S[p..n]。

【輸入】

輸入檔案名:nico.in

第一行一個僅由小寫英文字母組成的串 S。

第二行一個整數 q。

接下來 q 行,每行一個數 p_i,表示第 i 次的問題是:“S 的字尾 p_i 是不

是滿足性質 P 的串呀”。

【輸出】

輸出檔案名:nico.out

輸出檔案一共 q 行,第 i 行為對第 i 個問題的回答。

如果滿足性質 P,回答:“niconiconi”。(不包含引号)

如果不滿足性質 P,回答:“no”。(不包含引号)

【資料範圍】

測試點 1..3:|S|≤100

測試點 1..6:|S|≤1000

測 試 點

1..10 : 1 ≤ |S| ≤ 5*10 5 , 1 ≤ q ≤ 10 5

形如ABABA的串,可以化為(端點)A(斷點2)[BA(2)](斷點1)[BA(1)]

我們令f[i]為1~i與1~n 的最長公共字尾

枚舉斷點1為i

[BA(1)]=str[i~n]

[BA(2)]=str[j~i-1]   (n-i+1=i-j)

則端點的範圍為j-min(g[j-1],n-i)

則j-min(g[j-1],n-i)~~j-1的字尾顯然都符合ABABA

那麼有幾個問題:

1.怎麽求出f[i],用二分,二分長度并比對,比對失敗則縮小長度

2.怎麽快速判斷字元串相同,用字元串hash

3.j-min(g[j-1],n-i)~~j-1用差分數組全部+1,就可以O(1)查詢