再整理一遍板子
例題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 ...