一个由A B C连续构成且必须含有(1)的子串构成的无限串,现在知道某些位置的字母,求这个子串,(记作a个A,b个B,c个C)且要是最小字典序(2)
(1) 也就是这个子串必须要有A B C,而且是所有的a个A完之后,才是B C
例如下面两个不合法 1.ABBB(没有C) 2. ABAC(B后面有A) 3.ACB(C后面有B) 也就是连续的,像AABCCC这种
(2)指数字最小字典序,而不是字母 即首先要a最小,然后是b最小,然后是c最小
样例
1(1组数据,最大为40个) 3(3个信息,最多有5000个) 1 A 5 A 11 B(无限串对应位置字母,对应位置最大10000)
输出 1 2 1 (ABBC)
无限串(ABBCABBCABBCABBC......)
如果没有答案,输出NO
首先你可以先确定子串的长度,从3-10000
然后,确定A的末端,B的开始,B的末端,C的开始(A的开始和C的末端不用处理,A的开始就是1,C的开始就是子串的len)
然后根据信息取模len,最大的记作末端,最小的记作开始,然后找到子串!
你没理解,很正常!
现在上数据来解释!
1
6
4 C
7 A
11 B
13 B
9 C
18 A
我们len先是3 则A的末端就是max(7%3 , 18 % 3) 注意,模下来是0则表示在末尾,所以我们认定18%3==len
A的末端就是3
B的开始就是 min(11%3 , 13 % 3) = 1
......
我们一直这样,如果A的末端在B的开始的右边或者B的末端在C的开始的右端,那么子串长度为len时是找不到的
1(1组数据,最大为40个) 3(3个信息,最多有5000个) 1 A 5 A 11 B(无限串对应位置字母,对应位置最大10000)
这组数据,我们循环到len为4时才能找到答案
right_a = max(1 % 4 , 5 % 4) = 1
begin_b = 11 % 4 = 3
right_b = 11 % 4 = 3
begin_c = 初始值
因为没有C的信息,所以4个变量的初始值要设好哟!
然后我们就知道了A的开始和末端为1 B的开始和末端为3 C的开始为初始值(你想嘛!), C的末端为4
就是A_BC这样的
那么第2个填什么,你字典序最小,当然填B啦 ABBC 就输出1 2 1了!
枚举每一个len,求出有关A B C的位置取模len后的最小最大来确定开始和末端(一些取模细节和初始值,解决最小字典序这些操作自己都很好想的是吧!),最终找到答案!
自然,这样会超时,我们超快的知道最小最大不就好了!,优化点就在这里,自己去想吧!
友情提示:i 3-10000 i+=1 j 1-10000 j+=i 是不会超时的!