Beautiful string(bs.cpp)
试题描述:
WSM 认为 O 和 X 是最优美的两个字母,由它们组成的串最优美。在这些最优美的串
中,如果任意只包含X的子串,长度不超过maxX,任意只包含O的子串,长度不超过maxO, 且整个串最多有 countO个O,countX个X。那么这个就是超级优美无敌串。 现在WSM想知道最长的超级优美无敌串有多长,希望你能告诉她。
输入格式:
输入包含多行,至文件结束为止; 每行四个数,依次是 CountO、CountX、maxO、maxX。
输出格式:
每组数据输出一行,一个数表示最长的超级优美无敌串的长度。
数据规模:
0<=CountO,CountX,maxO,maxX<=1000000
输入样例:
10 10 0 0 3 5 1 1
输出样例:
0 7
注意事项: 第二个样例的解释:“XOXOXOX”. 最多 1000 组数据,其中 30%的数据 0<=CountO,CountX,maxO,maxX<=20,且数据组数
不超过 20 组。
题解
如果maxO是零的话,说明就只有一段X。答案就是maxX,maxX是零也是同理。
现在考虑剩余的情况 ,我们先假设X不够用,说明就算是每次放maxO个O,然后用一个X把它们隔开,这种情况X还是不够用。
OOO…OOOXOOO…OOOXOOO…OOO…;
也就是说:CountO > (CountX+1) * maxO;
那么答案最大就只有可能是CountX + (CountX+1) * maxO。
同理O不够的情况也是如此。对于剩下的情况,答案就是CountX + CountO。值得注意的是,在计算(CountX