牛语单词通过以下规则构造:
- 牛语单词仅由小写字母构成。
- 牛语单词的具体结构为:词根+若干个(0 个或更多)后缀,其中:
- 词根为长度大于 4 的字符串。
- 后缀为长度 2 或 3 的字符串。
- 在构成单词时,不允许连续两次(或更多次)添加同一后缀。
给定一个已经构造好的牛语单词 s,请你根据牛语单词的构造规则,找到该单词的所有可能后缀。
例如,如果给定单词为 cbcaabaca,则它可能的构造方式为 cbcaabaca、cbcaaba+ca、cbcaab+aca、cbcaa+ba+ca,因此,它的所有可能后缀为 aca,ba,ca。
输入格式
一个由小写字母构成的字符串 s。
输出格式
第一行输出整数 k,表示单词 s 的所有可能后缀的数量。
接下来 k 行,按照字典序每行输出一个可能后缀。
数据范围
前 3 个测试点满足 5≤|s|≤10。
所有测试点满足 5≤|s|≤10^4。
输入样例1:
cbcaabaca
输出样例1:
3
aca
ba
ca
输入样例2:
abaca
输出样例2:
0
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String s=scan.next();
int[] t=new int[100010];
t[s.length()-1]=1;
TreeSet<String> set=new TreeSet<>();
for(int i=s.length()-1;i>=4;i--) {
for(int j=2;j<=3;j++) {
if(t[i+j]==1) {//是正确的词根
String a="";
String b="";
if(i+j+1<=s.length()) {
a=s.substring(i+1,i+j+1);
}
if(i+2*j+1<=s.length()) {
b=s.substring(i+j+1,i+2*j+1);
}
if(!a.equals(b)||t[i+5]==1) {//i+5:能构成词根
t[i]=1;
set.add(a);
}
}
}
}
System.out.println(set.size());
for(String ss:set) {
System.out.println(ss);
}
}
}