题目名称 3513. kmp模板
输入输出 kmp.in/out
难度等级 ★☆
时间限制 1000 ms (1 s)
内存限制 256 MiB
测试数据 10
题目来源 Gravatartat 于2020-12-30加入
开放分组 全部用户
提交状态
分类标签
KMP
分享题解
通过:27, 提交:46, 通过率:58.7%
Gravatartat 100 0.000 s 0.00 MiB C++
Gravatartat 100 0.000 s 0.00 MiB C++
GravatarTheresis 100 0.000 s 0.00 MiB C++
Gravatar增强型图元文件 100 0.000 s 0.00 MiB C++
Gravataryrtiop 100 0.000 s 0.00 MiB C++
Gravataryrtiop 100 0.000 s 0.00 MiB C++
Gravataryrtiop 100 0.000 s 0.00 MiB C++
Gravataryrtiop 100 0.000 s 0.00 MiB C++
Gravataryrtiop 100 0.000 s 0.00 MiB C++
Gravatarcb 100 0.000 s 0.00 MiB C++
关于 kmp模板 的近10条评论(全部评论)
军训回来第一模板题
Gravatar┭┮﹏┭┮
2023-08-25 17:57 3楼
数据好弱,BF居然过了。。。
upd:现在换了C++14,next 还不能定义成数组名了,只能用 nxt 或 Next 替代了QAQ
Gravataryrtiop
2021-11-16 21:00 2楼
Gravatartat
2021-01-08 21:38 1楼

3513. kmp模板

★☆   输入文件:kmp.in   输出文件:kmp.out   简单对比
时间限制:1 s   内存限制:256 MiB

【题目描述】

给出两个字符串 $s_1$ 和 $s_2$,若 $s_1$ 的区间 $[l,r]$ 子串与 $s_2$ 完全相同,则称 $s_2$ 在 $s_1$ 中出现了,其出现位置为 $l$。

现在请你求出 $s_2$ 在 $s_1$ 中所有出现的位置。

定义一个字符串 $s$ 的 $border$ 为 $s$ 的一个非 $s$ 本身的子串 $t$,满足 $t$ 既是 $s$ 的前缀,又是 $s$ 的后缀。

对于 $s_2$,你还需要求出对于其每个前缀 $s$′ 的最长 $border$ $t$′ 的长度。

【输入格式】

第一行是$s_1$,第二行是$s_2$;

【输出格式】

首先输出若干行,每行一个整数,按从小到大的顺序输出 $s_2$ 在 $s_1$ 中出现的位置。

最后一行输出 ∣$s_2$∣ 个整数,第 $i$ 个整数表示 $s_2$ 的长度为 $i$ 的前缀的最长 $border$ 长度。

【样例输入】

ABABABC
ABA

【样例输出】

1
3
0 0 1

【数据规模与约定】

对于全部的测试点,保证$s_1.len$,$s_2.len<10^6+20$,$s_1$,$s_2$ 中均只含大写英文字母。

【来源】

$lg$