AcWing第147场周赛(5556.牛的语言学)

牛语单词通过以下规则构造:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值