小问题玄关!!!
查看原帖
小问题玄关!!!
1399216
_Gloaming_楼主2024/7/25 15:20

问一下这个什么意思?为什么要这么求?!!

 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;
}
2024/7/25 15:20
加载中...