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";
	  	  
	  
}

  

posted @ 2016-03-03 20:50  外婆桥  阅读(277)  评论(0编辑  收藏  举报