某电视台在每一个星期天都有一个福利彩票节目,在该节目中有一个考察幸运观众记忆力的节目。节目的安排是这样的:首先由节目主持人说出一串诸如“左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),请你编程求出第一次出现的最长重复子串。
输入:输入文件为1行,它是一串数值串。
输出:输出文件为1行,它是输入文件中数值串的第一次出现的最长重复子串。如果无重复子串则输出字符串“NO”。
string.in :
L1R2L2L4R5L3L4R5L3R4R5L3R4R5R6L1
String.out:
L4R5L3
#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"; }