在一场盛大的生日派对后,Katie(以下简称Ka)仍然想和Shiro(以下简称S)去找更多的乐子。不一会,她就想到了一个游戏,叫做寻宝。当然,她邀请了她最好的朋友Kuro(以下简称Ku)和S和她一起玩。
三个朋友都很聪明所以他们很快的通过了所有挑战并且终于到达了终点。但是宝藏只能属于一只猫(主角们都是猫),所以他们开始想个决定宝藏归属的法子。很快的,Ku带着一些丝带前来。
每只猫都被发放了一条随机颜色,鲜艳的丝带。每一种丝带的颜色都可以用大写字母或小写字母表示。我们定义:一种颜色的字母表达式内的一段连续子序列既是丝带中的一段子丝带。丝带美丽的程度由它的子丝带出现次数的最大值决定。越多子丝带,这条丝带就越美丽,比如说,aaaaaaa色的丝带有美丽值7,因为它的子序列出现了7次,abcdabc有美丽值2,因为它的子序列abc出现了两次。
规则很简单。游戏将会进行n轮,每一轮每一只猫都必须对自己的丝带改变严格的“一种”颜色(在自己的回合),使之变成不同于之前的随机颜色。比如说,aaab可以在一回合内变成acab。n轮游戏后美丽值最大的丝带的主人赢得比赛。
输入:
第一行包含一个整数n,代表回合数。
接下来的三行包含Ku,S,Ka的三条丝带,一条丝带各自占一行。每一条丝带都是一个字符串,包含不超过1e5的大小写字母组合而且不是空字符串。为了公平,保证三条丝带长度相同。注意大小写字母被认为表示了不同的颜色。
输出:
输出赢家的名字 (“Kuro”, “Shiro” 或是 “Katie”),如果至少两只猫的丝带有相同的美丽值,那么输出“Draw(平局)”。
思路:如果n小于或等于剩余字母的数量,只需将选定字母的数量加上n即为得分。
如果用所选字母替换所有字母后,还剩下的替换次数 n 是偶数,我们可以选择一个任意字母,用其他字母代替,换回来,并重复该动作,直到n到0为止。
否则,我们不会替换所有其他字母。 相反,我们将替换这些字母,直到剩下1个字母(现在n是偶数),然后用另一个与我们选择的字母不同的字母替换该字母。 之后,用我们选择的字母替换那封信。
现在n又成了偶数,我们重复上面讨论的动作。
当且仅当一个字符串全是某个字母,且 n = 1 时才需要考虑"换不回来"的情况,此时的答案变成字符串长度 - 1
```#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
int n;
using namespace std;
const int N = 100;
typedef pair<int, char> PIC;
int get_ans(string s){
map<char, int> m;
for (int i = 0; i < (int)s.size(); i ++)
m[s[i]] ++;
PIC S(0, '0');
for (int i = 50; i < 150; i ++)
if (m[char(i)] > S.first)
S.first = m[char(i)], S.second = char(i);
if (n <= (int)s.length() - S.first) return S.first + n;
else{
if ((S.first == (int)s.length())&& n == 1) return s.length() - 1;
else return s.length();
}
}
int main(){
cin >> n;
string s1, s2, s3;
cin >> s1 >> s2 >> s3;
int ans1 = get_ans(s1);
int ans2 = get_ans(s2);
int ans3 = get_ans(s3);
if(( ans1 > ans2) && (ans1 > ans3)) puts("Kuro");
else if((ans2 > ans1) && (ans2 > ans3)) puts("Shiro");
else if((ans3 > ans1) && (ans3 > ans2)) puts("Katie");
else puts("Draw");
return 0;
}