【Luogu P3426】[POI2005]SZA-Template

链接:

洛谷

题目大意:

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

思路:

t 一定是 s 的一个前后缀(s 也算),考虑 DP。设 fi 表示前缀 i 的答案,那么 fi 要么是 i,要么是 fborder(i)。那么如果是 fborder(i),那么某个 fj=fborder(i) 一定在 [iborder(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 ("%d\n", f[n]);
return 0;
}
posted @   Jayun  阅读(29)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
点击右上角即可分享
微信分享提示