40分求助
查看原帖
40分求助
547120
fanke楼主2023/7/18 08:50
#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

2023/7/18 08:50
加载中...