Problem Description

我们都知道,前缀就是一个单词的前几个字母(长度小于单词长度);后缀就是一个单词的后几个字母(长度小于单词长度)。例如:Hello,{H,He,Hel,Hell}都是Hello的前缀,{ello,llo,lo,o}都是Hello的后缀。现在,给你一个字符串String,你的任务是找出一个字串s,s既是String的前缀,又是String的后缀,并且s也出现在String的中间部分(既不是前缀,也不是后缀),s的长度越长越好。

Input

输入一个N,接下来N行,每行一个字符串String,String长度len( 1 <= len <= 1000000)。

Output

输出只有一行,如果有符合条件的s,输出长度最长的s,如果没有,输出“Bad Luck!”(不含引号)。
Sample Input
3
abcabcabcabcabc
papapapap
aaabaaaabab

Sample Output

abcabcabc
papap
Bad Luck!

Hint

Source

GLSilence

思路:
对KMP算法中的next数组进行处理,让next数组整体左移一位。可以得到相同最大前缀和后缀,然后在第二个字符开始,以前缀作为模式串进行查找,如果第一个找到的恰好是后缀,即返回的索引为后缀的第一个字符的索引,此时该字符串中间没有此模式串。
本题中用到的next数组,其实是下面文章中提到的《最大长度数组》
文章链接

package cn.edu.sdut.acm;import java.awt.geom.FlatteningPathIterator;
import java.util.*;public class Main{static int[] next = new int[1000001];public static void getNext(int len, String str) {next[0] = -1;int j = 1;int k = -1;while(j < len){// 递归思想,如果前缀字符与后缀字符不匹配,且没有匹配到字符串,则进行递归循环while(k != -1&&str.charAt(j) != str.charAt(k+1)){k = next[k];}// 循环结束后,如果在前缀中找到与后缀字符相同的字符,则k可以后移if (str.charAt(j) == str.charAt(k+1)){k++;}// 当前字符的next值即为knext[j] = k;j++;}}public static void main(String[] args){Scanner sc = new Scanner(System.in);int n = sc.nextInt();while(n > 0){n--;int r = 0;String str = sc.next();int len = str.length();getNext(len, str);if (len < 3||next[len-1] == -1){ // 若没有相同的前后缀,或字符串长度小于边界条件3,判定非法System.out.println("Bad Luck!");}else{r = len - 1;boolean flag = false;while(next[r] != -1) { // 递归循环if (str.indexOf(str.substring(0, next[r] + 1), 1) != len - 1 - next[r]) { // 若果在母串中找到不是后缀字符串的前缀字符串,则合法System.out.println(str.substring(0, next[r] + 1));flag = true;break;}r = next[r]; // 缩小相同的前后缀长度}if (!flag){System.out.println("Bad Luck!");}}}}
}片

SDUTOJ 2784 - Good Luck!相关推荐

  1. sdut2784cf 126b Good Luck!(next数组)

    链接 next数组的巧妙应用  学弟出给学弟的学弟的题.. 求最长的 是前缀也是后缀同时也是中缀的串  next的数组求的就是最长的前后缀 但是却不能求得中缀 所以这里 就把尾部去掉之后再求 这样就可 ...

  2. Luck Club-SDT 去中心化的游戏

    Super Single DOG Token简称SDT,区块链3.0时代加游戏的新型产物,币圈的新兴之秀.SDT沿用以太坊智能合约账本,与币圈无缝对接,不仅是独立的数字货币.同时,它也是全球知名游戏开 ...

  3. HDU 1847 Good Luck in CET-4 Everybody!(组合博弈)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. Steve J. Luck推出最新ERPs独家视频课程

    Steven J. Luck团队为想要学习ERP基础知识的学生而设计了这门课程.该课程视频分为"章节",每个章节包含4-8个视频.该课程中还提供了相应的课程讲义.前五章重点介绍了E ...

  5. Good Luck!_JAVA

    Description 我们都知道,前缀就是一个单词的前几个字母(长度小于单词长度):后缀就是一个单词的后几个字母(长度小于单词长度).例如:Hello,{H,He,Hel,Hell}都是Hello的 ...

  6. sdutoj 2624 Contest Print Server

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2624 Contest Print Server ...

  7. HDU-1847 Good Luck in CET-4 Everybody! (博弈+找规律)

    大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考 ...

  8. He Fei ,First ,Good Luck

    Tonight, I will go to HeFei. something as follows: 1) speciality 2) sincerely 3) value Hope i can br ...

  9. Android Studio编译提示如下attribute layout_constraintBottom_toBottomOf (aka com.luck.pictureselector:layou

    1 问题 Android Studio编译提示错误如下 AAPT: error: attribute layout_constraintBottom_toBottomOf (aka com.luck. ...

最新文章

  1. oracle生成xml方法,oracle存储过程生成xml==转
  2. Codeforces Round #597 (Div. 2)题解A~D
  3. 北大林宙辰:追求机器学习研究的美感
  4. DeepMind最新发现!神经网络的性能竟然优于神经符号模型
  5. eclipse build path 以及 clean(转)
  6. 北邮OJ 981. 16校赛-Saber's Number Game
  7. Java实现消息发送
  8. php代码审计基础笔记
  9. 名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释
  10. request.GetResponse()超时的解决办法
  11. 使用Python进行多项式Lo​​gistic回归
  12. PageRank算法在社交网络上的应用
  13. IDEA MyEclipse Eclipse 快捷键大全(最终版)
  14. 计算机硬盘损坏修复软件,电脑硬盘损坏如何修复?自己动手就能解决
  15. 基于Android的记事本APP设计与实现
  16. Linux7/Centos7磁盘分区、格式化及LVM管理
  17. PyCharm自动添加作者注释
  18. Elasticsearch2.3.4集群安装指南
  19. java学习日记-进阶三
  20. ros ur5模拟扫描

热门文章

  1. 在linux中设置nexus开机自启动
  2. 完美解决:Chrome无法显示鼠标
  3. 微信小程序申请地理位置接口wx.getLocation不通过的应对方案 过率很高
  4. java雍俊海_JAVA程序设计 雍俊海(学习笔记3)
  5. python编写程序、从键盘输入一个年份_Python 编写程序,从键盘输入年月日,判断是当年的第几天。...
  6. 遗传算法配送路径优化java_基于遗传算法的配送中心路径优化问题分析
  7. 【最重要的代码规范】做人做事必须坚守这些原则!
  8. 污水处理系统 | 污水处理项目程序规范,图纸清晰
  9. 下载github包慢
  10. 期权中的两个概念:认沽期权和期权激励