循环移位与重复子串查找

C# Hard loops

任务 «循环移位与重复子串查找»

给定一个由小写拉丁字母组成的字符串S,需要将字符串循环左移K个位置(K可能大于字符串长度)。移位后,在新字符串中找出所有长度为L(L已给定)的不重叠重复子串。重复子串是指在字符串中出现两次或以上,且其出现位置互不重叠的子串。输出此类子串的数量,并按字典序输出这些子串本身。如果没有此类子串,则输出0。

输入格式

在第一行输入一个整数 N (1 ≤ N ≤ 1000) — 字符串的长度。在第二行输入字符串 S 本身。在第三行输入一个整数 K (0 ≤ K ≤ 10^9) — 偏移次数。在第四行输入一个整数 L (1 ≤ L ≤ N) — 子串的长度。

输出格式

在第一行输出一个整数 M — 长度为 L 的唯一重复不重叠子串的数量。如果 M > 0,则在接下来的 M 行中按字典序输出这些子串本身。

示例

示例 1

输入
5 abcde 3 2
输出
0

示例 2

输入
10 abracadabra 5 4
输出
1 abra
main.cs