蒟蒻LCA输出只输出根节点求助
查看原帖
蒟蒻LCA输出只输出根节点求助
950927
_luo_gu楼主2024/6/23 14:57

以下代码 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 ;
}

感谢大佬,好人一生平安

2024/6/23 14:57
加载中...