全MLE0分求调
查看原帖
全MLE0分求调
582604
cjy__spike楼主2023/7/13 15:46
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
string s;
int p,q,m,nxt[maxn],fa[maxn][22],lg[maxn],depth[maxn];
vector<int> g[maxn];
void dfs(int u,int fath)
{
	fa[u][0]=fath;
	for(int i=1;i<=lg[depth[u]];i++)
	{
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int v : g[u])
	{
		depth[v]=depth[u]+1;
		dfs(v,u);
	}
}
int get(int a,int b){
	if(depth[a]<depth[b]) swap(a,b);
	while(depth[a]>depth[b]) a=fa[a][lg[depth[a]-depth[b]]];
	if(a==b) return a;
	for(int i=lg[depth[a]];i>=0;i--)
	{
		if(fa[a][i]!=fa[b][i])
		{
			a=fa[a][i];b=fa[b][i];
		}
	}
	return fa[a][0];
}
int main()
{
	cin>>s;
	
	nxt[0]=0;
	int j=0;
	for(int i=1;i<s.size();i++)
	{
		while(j&&s[j+1]!=s[i]) j=nxt[j];
		if(s[j+1]==s[i]) j++;
		nxt[i]=j;
	}
	for(int i=0;i<s.size();i++)
	{
		g[nxt[i]].push_back(i);
	}
	lg[1]=0;
	for(int i=2;i<=s.size();i++)
	{
		lg[i]=lg[i-1]+((i&-i)==i);
	}
	depth[0]=0;dfs(0,0);
	cin>>m;
	while(m--)
	{
		scanf("%d%d",&p,&q);
		printf("%d\n",get(fa[p][0],fa[q][0]));
	}
	return 0;
}
2023/7/13 15:46
加载中...