社区讨论

蒟蒻 64 分WA,求助失配树

P5829【模板】失配树参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo8g6jdi
此快照首次捕获于
2023/10/27 18:05
2 年前
此快照最后确认于
2023/10/27 18:05
2 年前
查看原帖
我的思路是先运用 KMP 中的思想,预处理出 nxtnxt 数组(BorderBorder),并让 iinxti\large nxt_{i} 连边,记录深度,每次询问用倍增求 LCA,但一直 172517 \sim 25 测试点 WA,大佬能否前来敲打敲打
CPP
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#define REP(i, x, y) for(int i = x; i < y; i++)
#define rep(i, x, y) for(int i = x; i <= y; i++)
#define PER(i, x, y) for(int i = x; i > y; i--)
#define per(i, x, y) for(int i = x; i >= y; i--)
#define lc (k << 1)
#define rc (k << 1 | 1)
using namespace std;
const int N = 1E6 + 5;
string s;
int len, m;
int fa[N][25];
int nxt[N], dep[N];
int lca(int x, int y)
{
	if(dep[x] < dep[y]) swap(x, y);
	int temp = dep[x] - dep[y];
	per(i, 22, 0)
	{
		if((temp >> i) & 1)
		{
			x = fa[x][i];
		}
	}
//	if(x == y) return fa[x][0];
	per(i, 22, 0)
	{
		if(fa[x][i] != fa[y][i])
		{
			x = fa[x][i];
			y = fa[y][i];
		}
	}
	return fa[x][0];
}
int main()
{
	cin >> s;
	len = s.length();
	s = "0" + s;
	nxt[0] = 0;
	nxt[1] = 0;
	fa[0][0] = 0;
	dep[0] = 0;
	fa[1][0] = 0;
	dep[1] = 1;
	int j = 0;
	for(int i = 2; i <= len; i++)
	{
		if(j && s[i] != s[j + 1])
		{
			j = nxt[j];
		}
		if(s[i] == s[j + 1])
		{
			j++;
		}
		nxt[i] = j;
		fa[i][0] = j;
		dep[i] = dep[j] + 1;
	}
	for(j = 1; j <= 22; j++)
	{
		for(int i = 1; i <= len; i++)
		{
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
		}
	}
	scanf("%d", &m);
	while(m--)
	{
		int x, y;
		scanf("%d%d", &x, &y);
	    printf("%d\n", lca(x, y));
    }
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...