模板:字尾陣列毒瘤
看見題面上的「字尾」、「$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#includeview code#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;
}
洛谷 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 走...