洛谷P5112 FZOUTSY(字串雜湊 莫隊)

2022-08-21 05:00:11 字數 1776 閱讀 2314

模板:字尾陣列毒瘤

看見題面上的「字尾」、「$lcp$」等字樣,dalao們大概馬上想到字尾陣列了。但是這道題能不能不用字尾陣列呢?(其實是我不會字尾陣列)

不難想到,$lcp\ge k$意味著兩個字串的前$k$個字元是相同的,於是大力字串雜湊,用$$(a_x^+a_x^+...+a_)*k-a_x^+a_=a_x^+a_x^+...+a_$$不難$o(n)$算出各個長度為$k$的子串的雜湊值,接下來就是統計方案了。可以參考小z的襪子,用莫隊解決問題。

但是,$o(n\sqrt)$的莫隊會被卡,所以要用塊大小為$\frac}$的莫隊,複雜度為$o(n\sqrt)$,對於$n^m\le 10^$,即$n\sqrt\le 3.2*10^$的資料,可以通過。

另外,模數太小的字串雜湊也會被卡,最好直接用unsigned long long,相當於模$2^$,再對$n$個值離散化。

#include#include

#include

#include

#define pc(a) putchar(a)

using

namespace

std;

typedef unsigned

long

long

ll;const

int n=3000050

;const

int m=100050

;const

int p=3000017

;const

int x=233; //

233char bb[1

<<21],*s,*t;

inline

char gc()

inline

short

rdc()

inline

intrdi()

short buf[25

];inline

void

wt(ll x)

pc(x|48

);

while(l>=0)pc(buf[l--]|48

); pc('\n

');}short

a[n];

int h[p],nxt[n],p[n],cnt[n],l[m],r[m],t[m],n,k,sz,o=1

;ll v[n],s[m];

inline

void

add(ll w)

inline

intfind(ll w)

//用雜湊表實現離散化

inline ll fp(int p)

returns;}

inline

void

work()

}}int cmp(int a,int b)

intmain()

sort(t,t+m,cmp);

x=l[t[0]];y=r[t[0

]];

for(i=x;i<=y;i++)

s[t[

0]]=ans;

for(i=1;i)

while(x>l[t[i]]);

else

for(;x)

if(r[t[i]]>y)do

while(y

else

for(;y>r[t[i]];y--)

s[t[i]]=ans;

} //莫隊

for(i=0;i)wt(s[i]);

return0;

}

view code

洛谷 5112 FZOUTSY 題解

部落格觀賞效果更佳 github cnblogs 給定字串 s ss,設 suf i suf i suf i 表示從 i ii 開始的字尾。支援 q qq 個詢問,每次給定 l,r l,r l,r 求這段區間中有多少對 i,j i,ji,j 使得 suf i suf i suf i 和 suf j ...

洛谷 P5587 打字練習

題目描述 r 君在練習打字。有這樣乙個打字練習 給定乙個范文和輸入框,會根據你的輸入計算準確率和打字速度。可以輸入的字元有小寫字母 空格和 英文句號 輸入字元後,游標也會跟著移動。輸入的文字有多行,r 君可以通過換行鍵來換行,換行後游標移動到下一行的開頭。r 君也可以按退格鍵 為了方便,退格鍵用 表...

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...