问一下这个什么意思?为什么要这么求?!!
if(x==p)
cout<<ne[p]<<"\n";
else if(x==q)
cout<<ne[q]<<"\n";
else
cout<<x<<"\n";
原代码在下面:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
int fa[N][22],dep[N],ne[N];
//由于border树没有实际的高度所以我们按照ne了几次作为节点的深度
char s[N];
int n,m,p,q,ls;
int lca(int a,int b)
{
if(dep[a]<dep[b])
swap(a,b);
while(dep[a]>dep[b])
{
int k=log2(dep[a]-dep[b]);
a=fa[a][k];
}
if(a==b)
return a;
for(int i=log2(dep[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()
{
scanf("%s",s+1);
ls=strlen(s+1);
cin>>m;
int j=0;
dep[1]=1;//!!!
fa[1][0]=0;//!!!
for(int i=2;i<=ls;i++)//fail树构建(倍增+kmp)
{
while(j && s[i]!=s[j+1])
j=ne[j];//!!!
if(s[i]==s[j+1])
j++;
ne[i]=j;
fa[i][0]=j;
dep[i]=dep[j]+1;
for(int k=1;(1<<k)<=dep[i];k++)
fa[i][k]=fa[fa[i][k-1]][k-1];
}
while(m--)
{
cin>>p>>q;
int x=lca(p,q);
if(x==p)
cout<<ne[p]<<"\n";
else if(x==q)
cout<<ne[q]<<"\n";
else
cout<<x<<"\n";
}
return 0;
}