字串模板(字尾陣列 字尾自動機 回文樹)

2021-10-05 10:18:40 字數 1441 閱讀 8380

再整理一遍板子

例題cf432d:問對字串s,對於所有的字首,當它等於同長度字尾時,這個子串一共在s**現多少次。

字尾陣列求lcp是logn,顯然直接二分即可。複雜度nlogn

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106107

108109

110111

112113

114115

116117

118119

120121

122

#includeusing namespace std;

const int n=1e5+2;

int n,sa[n],rnk[n],height[n];

char s[n];

int st[n][20];

//sa陣列表示字典序為i的字尾是誰,rnk陣列表示某個字尾的排名(1~n)

void buildsa(int m=128)

}//滿足lcp(l,r)=min,故是rmq問題

//st[i][j]表示[i,i+(1swap(l,r);

int k=0;

while((1<<(k+1))+1<=r-l+1) ++k;

return min(st[l][k],st[r-(1<> ans;

int main()

res+=max(a-l,0);

l=b,r=n;

while(l<=r)

res+=max(r-b,0);

ans.push_back(make_pair(len,res));

//printf("%d %d\n",len,res);

}cout<

模板 字尾陣列 字尾自動機

關於字尾自動機sam,貼乙個非常好的講解 字尾自動機學習小記 交洛谷模板可a 傳送門 洛谷 模板 字尾排序 include using namespace std const int n 1e6 5 char s n int sa n t1 n t2 n c n int n,m 555 void s...

字串 字尾自動機

struct sam void extend int c if p 0 int q nxt p c if len p 1 len q int v siz mc nxt v nxt q len v len p 1 lnk v lnk q cnt v 0 while p 0 nxt p c q lnk ...

字尾自動機模板

include include define maxc 28 using namespace std const int maxn 1e6 5 const int mod 1e9 7 typedef long long ll int len maxn 2 最長子串的長度 該節點字串數量 len x ...