#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 200001;
int p , q , np , nq , tmp = 0 , len = 0 , tot = 0 , cnt = 0 , root = 0;
int b[maxn] , t[maxn] , head[maxn] , step[maxn] , pre[maxn] , son[maxn][28] , size[maxn][2];
char s[maxn] , ss[maxn];
ll ans = 0;
struct piont
{
int to , next;
}f[maxn];
void addedge(int u , int v)
{
f[++ cnt].to = v;
f[cnt].next = head[u];
head[u] = cnt;
}
void sam(int x)
{
//int i , j;
scanf("%s" , s + 1);
len = strlen(s + 1);
np = 1;
if(!x) tmp = len;
for(int i = 1 ; i <= len ; i ++)
{
int c = s[i] - 'a' + 1;
p = np;
step[np = (++tot)] = step[p] + 1;
size[np][x] ++;
while(p && !son[p][c])
son[p][c] = np , p = pre[p];
if(!p)
{
pre[np] = root;
continue;
}
q = son[p][c];
if(step[q] == step[p] + 1)
pre[np] = q;
else
{
step[nq = (++ tot)] = step[p] + 1;
memcpy(son[nq] , son[q] , sizeof son[q]);
pre[nq] = pre[q];
pre[np] = pre[q] = nq;
while(p && son[p][c] == q)
son[p][c] = nq , p = pre[p];
}
}
}
void dfs(int u)
{
for(int i = head[u] ; i ; i = f[i].next)
{
int v = f[i].to;
dfs(v);
size[u][0] += size[v][0];
size[u][1] += size[v][1];
}
}
void solve()
{
for(int i = 1 ; i <= tot ; i ++)
addedge(pre[i] , i);
dfs(1);
for(int i = 1 ; i <= tot ; i ++)
ans += (ll)(step[i] - step[pre[i]]) * size[i][0] * size[i][1];
printf("%lld\n" , ans);
}
int main()
{
root = tot = 1;
sam(0);
sam(1);
len += tmp;
solve();
return 0;
}
有没有哪个大佬帮帮我QAQ