牛语单词通过以下规则构造:
- 牛语单词仅由小写字母构成。
- 牛语单词的具体结构为:词根+若干个(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);}}
}