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;
    }
}

 

posted @ 2019-11-19 10:15  Desert_eagle  阅读(157)  评论(0)    收藏  举报