Loj 6031 字尾自動機 分類 字串

2021-08-29 07:59:27 字數 1345 閱讀 8172

由題目意思可知,qk固定,小於等於105

10^5

105那麼我們分一下類:

(1)k≤q

kk\leq\sqrt

k≤qk

​每次暴力k2l

og2m

k^2log_m

k2log2

​m即可時間複雜度:o(q

k2lo

g2m)

o(qk^2log_m)

o(qk2l

og2​

m)(2)q≤q

kq\leq\sqrt

q≤qk

​每次暴力跑m次

先預處理當前字串1~i對應到字尾自動機上的哪個節點,然後在字尾樹上倍增跳即可。

時間複雜度:o(q

mlog

2n

)o(qmlog_n)

o(qmlo

g2​n

)**的時間!!!

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

int n,m,q,k;

#define maxn 100010

char ch[maxn],str[maxn];

struct segseg[maxn];

vectorg[405][405];

int ed[maxn],lth[maxn];

int fa[maxn<<1][18];

struct nodetree[maxn<<1];

int last=1,cnt=1;

int siz[maxn<<1];

int ton[maxn<<1],sa[maxn<<1];

inline void go(int &k,int dir,int id)

inline void insert(char c)

}last=now;

siz[now]=1;

} inline void solve()

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

for(int u=1;u<=cnt;++u)fa[u][i]=fa[fa[u][i-1]][i-1];

siz[0]=0;

}inline void rd(int &x)

}int main()

solve();

if(k<=unit)

}printf("%lld\n",ans);

} }else

printf("%lld\n",ans);}}

return 0;

}

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...

字尾自動機

常用於處理字串問題,可以高效解決許多字串問題。有點像將乙個字串的所有字尾都建在乙個ac自動機上,但不同的是字尾自動機的節點數最多為2 n,因為它只記錄需要記錄的點,一些沒有記錄東西的點可以視為與下面有價值的節點並在一起,這樣大大降低了時間複雜度和空間複雜度。對於每乙個節點記錄它的後面加上每個字元後字...

字尾自動機

基礎學習 簡潔明瞭的講解 總狀態數不超過2n 12n 1 2n 1 包括初始狀態 統計每個end po sendpos endpos 等價類出現位置數量時,要按長度從長到短的計算cnt cntcn t。那為什麼一定要從長到短呢?比如回文自動機就直接是按照節點編號從大到小計算cnt cntcn t 罪...