以下代码 fail数组和fa数组应该没有问题,不知道为啥
#include <bits/stdc++.h>
using namespace std ;
char s[1000005] ;
int m , q , p , len , fail[1000005] , fa[1000005][22] , dis[1000005] ;
int main(){
scanf("%s" , s+1 );
len = strlen(s+1);
int nod = 0 ;
//fail数组计算
for( int i = 1 ; i < len ; i ++ ){
while( nod != 0 && s[i+1] != s[nod+1] ){
nod = fail[nod] ;
}
if( s[i+1] == s[nod+1] ){
nod ++ ;
}
fail[i+1] = nod ;
}
//fa数组初始化
for( int i = 1 ; i <= len ; i ++ ){
fa[i][0] = fail[i] ;
}
//fa数组计算
for( int k = 1 ; k <= 22 ; k ++ ){
for( int i = 1 ; i <= len ; i ++ ){
fa[i][k] = fa[fa[i][k-1]][k-1] ;
}
}
//dis数组
for( int i = 1 ; i <= len ; i ++ ){
nod = i ;
while( nod != 0 ){
nod = fail[nod] ;
dis[i] ++ ;
}
}
scanf("%d" , &m );
//询问
while( m -- ){
//输入
scanf("%d%d" , &q , &p );
if( dis[q] < dis[p] ){
swap( p , q );
}
while( dis[q] < dis[p] ){
q = fa[q][0] ;
}
for( int i = 22 ; i >= 0 ; i -- ){
if( fa[q][i] != fa[p][i] ){
q = fa[q][i] ;
p = fa[p][i] ;
}
}
printf("%d\n" , fa[p][0] );
}
return 0 ;
}
感谢大佬,好人一生平安