codevs 1061 重复子串
题目描述 Description
某电视台在每一个星期天都有一个福利彩票节目,在该节目中有一个考察幸运观众记忆力的节目。节目的安排是这样的:首先由节目主持人说出一串诸如“左1右2左2左3右4左1”的数值串,然后由幸运观众重复该数值串;如果幸运观众能全部记忆出节目主持人说的所有数值串,该观众将获得一笔数目可观的奖金。为了确保节目的质量,节目导演希望这种数值串中不含连续的2个以上相同子串,这样数值串就不易记忆。他们称这种有连续相同子串的数值串为“易数值串”,而这种相同子串称为重复子串;无重复子串的数值串称为“难数值串”。
例如,下列字符串是“易数值串”:
(1)左1左1 (2)左1右2左3右2左3右2(3)左1右2左4左1右2左4右2
而下列字符串是“难字符串”:
(1)左1(2)左1右2(3)左1右2左1右1(4)左1右2右4左1右2
现假设:
(1)数值前只有“左”和“右”2个方向,分别用L和R代替“左”和“右”。
(2)数字范围为1,2,3,4,5,6,7,8,9。
(3)所有子串指的是“左”或“右”开始的子串,以诸如“1右2左”的连续重复子串不计算为重复子串。
你的任务是:对于给定一个数值串(串的长度<=100000),请你编程求出第一次出现的最长重复子串。
输入描述 Input Description
输入:输入文件为1行,它是一串数值串。
输出描述 Output Description
输出:输出文件为1行,它是输入文件中数值串的第一次出现的最长重复子串。如果无重复子串则输出字符串“NO”。
样例输入 Sample Input
string.in :
L1R2L2L4R5L3L4R5L3R4R5L3R4R5R6L1
样例输出 Sample Output
String.out:
L4R5L3
数据范围及提示 Data Size & Hint
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() { int begin=0,end=0,f=0,l; char a[100001]; cin>>a; l=strlen(a); for (int i=0;i<l-4;i+=2)//两个字符为一组 for (int j=i+2;j<=i+(l-i)/2;j+=2)//j在 i的下一位非数字的符号到剩余符号的一半 取值 if (equal(a+i,a+j,a+j))/*equal算法是逐一比较两个序列的元素是否相等 表示num数组从i开始到j区间内的字符串是否与从j开始的字符串相同 */ { if (j-i>end-begin) { begin=i; end=j;//由于j是下一组的第一个字符,所以最后输出时不输出a[end] f=1; } if (j==i+(l-i)/2) break; } if (f) for (int i=begin;i<end;i++) cout<<a[i]; else cout<<"NO"; }
I'm so lost but not afraid ,I've been broken and raise again