题目
感觉这个才应该是后缀自动机的模板题啊
由定义可知,字符串中不同子串的个数就是sigma(len[i]-len[fa[i]])
如果由定义没看出来的话,就可以画一画,如果还是没看出来的话,那就背下来吧qwq
就是个板子
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6+7;
struct node
{
int ch[26];
int len,fa;
}point[maxn<<1];
int las = 1,tot = 1;
void add(char c)
{
int p = las;
int np = las = ++tot;
point[np].len = point[p].len + 1;
for(;p && !point[p].ch[c];p=point[p].fa) point[p].ch[c] = np;
if(!p) point[np].fa = 1;
else
{
int q = point[p].ch[c];
if(point[q].len == point[p].len+1) point[np].fa = q;
else
{
int nq = ++tot;
point[nq] = point[q];
point[nq].len = point[p].len+1;
point[q].fa = point[np].fa = nq;
for(;p && point[p].ch[c] == q;p=point[p].fa) point[p].ch[c] = nq;
}
}
}
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++) add(s[i]-'a');
long long ans = 0;
for(int i=1;i<=tot;i++) ans += point[i].len - point[point[i].fa].len;
printf("%lld\n",ans);
return 0;
}