全寄求助
查看原帖
全寄求助
756660
B612Dusk楼主2024/7/16 00:07

没发现代码死在哪了,打表出来的 lcp 和 z 数组的值也一样,但是寄了

#include <bits/stdc++.h>

const int N = 2e7 + 10;

using namespace std;

inline int read()
{
	int t;
	cin >> t;
	return t;
}

int n, z[N], ans1, ans2, lcp[N], m;
char str[N], ch[N];

inline void Z()
{
	z[1] = n;
	for(int i = 2, r = 0, l = 1;i <= n;i = -~i)
	{
		if(i <= r)	z[i] = min(z[i - l + 1], r - i + 1);
		
		while(i + z[i] <= n && str[z[i] + 1] == str[z[i] + i])	++ z[i];
		if(i + z[i] - 1 > r)	r = i + z[i] - 1, l = i;
	}
}

inline void exkmp()
{
	for(int i = 1, l = 1, r = 0;i <= m;i = -~i)
	{
		if(i <= r)	lcp[i] = min(lcp[i - l + 1], r - i + 1);
		
		while(i + lcp[i] <= m && str[lcp[i] + 1] == ch[lcp[i] + i])	 ++ lcp[i];
		if(i + lcp[i] - 1 > r)	r = i + lcp[i] - 1, l = i;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	cin >> ch + 1 >> str + 1;
	n = strlen(str + 1);
	m = strlen(ch + 1);
	
	Z();
	
	for(int i = 1;i <= n;i = -~i)	ans1 ^= i * (z[i] + 1);
	
	exkmp();
	
	for(int i = 1;i <= m;i = -~i)	ans2 ^= i * (lcp[i] + 1);
	
	cout << ans1 << endl << ans2 << endl;
	
	return 0;
}
2024/7/16 00:07
加载中...