求助,在 P5546 过了,但是在本题 WA 了
查看原帖
求助,在 P5546 过了,但是在本题 WA 了
727411
invisible_person楼主2023/3/20 15:26

用的 SAM,输入格式也改了,感觉很玄学。

#include <bits/stdc++.h>
#define int long long
using namespace std;

int read() {
	int s = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
		f = (ch == '-' ? -1 : 1), ch = getchar();
	while (ch >= '0' && ch <= '9')
		s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
	return s * f;
}

#define N 1000005

int n;
char s[N];

struct SAM {
	int SZ = 1, lst = 1;
	struct node {
		int len = 0, lnk = 0, nxt[26] = {0};
		void init() {
			len = lnk = 0;
			memset(nxt, 0, sizeof nxt);
		}
	} t[N << 1];
	int to[N << 1], nxt[N << 1], head[N << 1], tot = 0;
	int ans[N << 1], mat[N << 1];
	vector<int> e[N << 1];
	void init() {
		SZ = lst = 1, tot = 0;
		memset(head, 0, sizeof head);
		t[1].init();
	}
	void add(char ch) {
		int cur = ++SZ;
		t[cur].init(), t[cur].len = t[lst].len + 1, ans[cur] = t[cur].len;
		int p = lst;
		for (; p && !t[p].nxt[ch - 'a']; p = t[p].lnk)
			t[p].nxt[ch - 'a'] = cur;
		if (!p) {
			t[cur].lnk = 1;
			lst = cur;
			return ;
		}
		int q = t[p].nxt[ch - 'a'];
		if (t[q].len == t[p].len + 1) {
			t[cur].lnk = q;
			lst = cur;
			return ;
		}
		int nq = ++SZ;
		t[nq].init(), t[nq] = t[q], t[nq].len = t[p].len + 1, t[cur].lnk = t[q].lnk = nq;
		for (int i = p; i && t[i].nxt[ch - 'a'] == q; i = t[i].lnk)
			t[i].nxt[ch - 'a'] = nq;
		lst = cur;
	}
	void pre() {
		for (int i = 2; i <= SZ; i++)
			e[t[i].lnk].push_back(i);
	}
	void dfs(int x) {
		for (int y : e[x])
			dfs(y), mat[x] = max(mat[x], mat[y]);
	}
	void match() {
		memset(mat, 0, sizeof mat);
		int cur = 1, len = 0;
		for (int i = 1; i <= n; i++) {
			while (cur && !t[cur].nxt[s[i] - 'a'])
				cur = t[cur].lnk, len = t[cur].len;
			if (!cur)
				cur = 1, len = 0;
			else
				len++, cur = t[cur].nxt[s[i] - 'a'];
			mat[cur] = max(mat[cur], len);
		}
		dfs(1);
		for (int i = 1; i <= SZ; i++)
			ans[i] = min(ans[i], mat[i]);
	}
	int calc() {
		int res = 0;
		for (int i = 1; i <= SZ; i++)
			res = max(res, ans[i]);
		return res;
	}
} sam;

signed main() {
	scanf("%s", s + 1), n = strlen(s + 1);
	for (int i = 1; i <= n; i++)
		sam.add(s[i]);
	sam.pre();
	while (~scanf("%s", s + 1))
		n = strlen(s + 1), sam.match();
	printf("%lld\n", sam.calc());
	return 0;
}
2023/3/20 15:26
加载中...