CF1965C Folding Strip 题解
手玩发现,不能再折叠的充要条件是剩下的串是一个
必要性显然,充分性考虑如下操作:从左往右扫描,遇到相邻相同的字符,就在之间折叠一次。
证明一下合法性:首先对于长度
然后对这样缩过的串考虑从左往右,依次在长度为
即对于折叠之后的串,相同字母所在位置的奇偶性一定相同(否则会再次折叠),这也说明剩下的是一个
假设对原串所有相邻相同位置都进行折叠,会得到唯一一个(翻转视作同一个)
接下来证明,这个
对于一个由初始字符串
而进行若干次折叠之后的串不长于原串,所以对于任意存在相邻相同位置的串,其都可以再进行折叠,得到唯一的,
实现:模拟对原串所有相邻相同位置都进行折叠的过程,维护
int l = 1 , r = 0;
for(int i = 0 , j = 0 , k = 1 ; i < n ; i++)
{
if(i && s[i] == s[i - 1])k *= -1;
else
{
j += k;
l = min(l , j);
r = max(r , j);
}
}
时间复杂度