AGC039A – Connection and Disconnection
题意:给定一个字符串s(10^2)和一个整数k(10^9),求将k个字符串s相连而不出现相邻两字符串的最少需要改变几次单个字符。
1.连续l个相同字符需要L/2次变化
2.若整个字符串只有一种字符,则需要n*k/2次
3.考虑首尾相等的情况,将字符串分为l1(与s[0]相等的前缀),l2(中间部分),l3(与s[n-1]相等的后缀),令s1为中间部分的结果,可知结果为(l1+l2)/2*(k-1)+l1/2+l2/2+s1*k;
额外的,还可以处理三个连续s字符串的数量,然后可以发现除第一个字符串的其他字符串循环节都为2.
#include <bits/stdc++.h> using namespace std; string s, s1; int k; int ans[3]; int main() { while (cin >> s >> k) { s1 = s + s + s; for (int i = 1; i < s1.size(); i++) { if (s1[i] == s1[i - 1]) { s1[i] = '.'; ans[(i / s.size())]++; } } k--; long long res = ans[0]; res += 1ll * (k + 1) / 2 * ans[1]; res += 1ll * k / 2 * ans[2]; cout << res << endl; } }

浙公网安备 33010602011771号