【Luogu P3426】[POI2005]SZA-Template

发布时间:2022-06-29 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了【Luogu P3426】[POI2005]SZA-Template脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

链接:

洛谷

题目大意:

给定一个字符串 (s),找到最小的 (t) 使得 (t) 匹配的位置能覆盖 (s)

思路:

(t) 一定是 (s) 的一个前后缀((s) 也算),考虑 DP。设 (f_i) 表示前缀 (i) 的答案,那么 (f_i) 要么是 (i),要么是 (f_{mathrm{border}(i)})。那么如果是 (f_{mathrm{border}(i)}),那么某个 (f_j=f_{mathrm{border}(i)}) 一定在 ([i-mathrm{border}(i),i]) 内。

代码:

const int N = 5e5 + 10;

inline ll Read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0', c = getchar();
	return x * f;
}

char s[N];
int nxt[N], f[N], g[N];;

int main() {
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	scanf ("%s", s + 1);
	int n = strlen (s + 1);
	for (int i = 2, j = 0; i <= n; i++) {
		while (j && s[i] != s[j + 1]) j = nxt[j];
		if (s[i] == s[j + 1]) j++;
		nxt[i] = j;
	}
	for (int i = 1; i <= n; i++) {
		f[i] = i;
		if (g[f[nxt[i]]] >= i - nxt[i]) f[i] = f[nxt[i]];
		g[f[i]] = i;
	}
	printf ("%dn", f[n]);
	return 0;
}

脚本宝典总结

以上是脚本宝典为你收集整理的【Luogu P3426】[POI2005]SZA-Template全部内容,希望文章能够帮你解决【Luogu P3426】[POI2005]SZA-Template所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: