AraBellaC(很水)

一个由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  是不会超时的!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值