题意:
给出三个字符串,每个字符串长度相同,给出n,要求在n轮内,每一个字符串必须改变一个字符。
问最后哪个字符串中拥有最多相同的字符,即美丽度最大。
思路:
首先,很不容易想到的一点是从a变到a,有两种方式a -> 其它 -> a,或者a -> 其它 -> 其它 -> a,即变2次或者变3次。
变3次是有意义的,比如第86个样例(wa在第86):
3
aaaaa
aaaaa
aaaab
答案是draw
因为第一个选一个a变3次变回a,第二个同理,第三个b到a再到b再到a就可以了,所以可以相同,这里存在一个误区。
根据这一组数据发现,唯一可能变少的情况就是这个字符串全部字母相同并且n = 1,那么最后的美丽度要减一,比如aaaaa,只能变一个,所以美丽度减一。
其它情况按照普通情况处理就好了。
相加大于len的直接取为len就ok。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <map> 5 #include <set> 6 using namespace std; 7 const int N = 1e5 + 10; 8 char a[N],b[N],c[N]; 9 map<char,long long> as,bs,cs; 10 int main() 11 { 12 long long n; 13 scanf("%lld",&n); 14 scanf("%s",a); 15 scanf("%s",b); 16 scanf("%s",c); 17 int len = strlen(a); 18 for (int i = 0;i < len;i++) 19 { 20 as[a[i]]++; 21 } 22 for (int i = 0;i < len;i++) 23 { 24 bs[b[i]]++; 25 } 26 for (int i = 0;i < len;i++) 27 { 28 cs[c[i]]++; 29 } 30 long long aa = 0,bb = 0,cc = 0; 31 if (as.size() == 1 && n == 1) 32 { 33 aa = len - 1; 34 } 35 else 36 { 37 for (auto it = as.begin();it != as.end();++it) 38 { 39 aa = max(aa,it -> second + n); 40 } 41 if (aa > len) aa = len; 42 } 43 if (bs.size() == 1 && n == 1) 44 { 45 bb = len - 1; 46 } 47 else 48 { 49 for (auto it = bs.begin();it != bs.end();++it) 50 { 51 bb = max(bb,it -> second + n); 52 } 53 if (bb > len) bb = len; 54 } 55 if (cs.size() == 1 && n == 1) 56 { 57 cc = len - 1; 58 } 59 else 60 { 61 for (auto it = cs.begin();it != cs.end();++it) 62 { 63 cc = max(cc,it -> second + n); 64 } 65 if (cc > len) cc = len; 66 } 67 long long ans = max(aa,bb); 68 ans = max(ans,cc); 69 int cnt = 0; 70 int ma = -1; 71 if (aa == ans) 72 { 73 cnt++; 74 ma = 1; 75 } 76 if (bb == ans) 77 { 78 cnt++; 79 ma = 2; 80 } 81 if (cc == ans) 82 { 83 cnt++; 84 ma = 3; 85 } 86 //printf("%d*\n",ma); 87 if (cnt >= 2) puts("Draw"); 88 else 89 { 90 if (ma == 1) puts("Kuro"); 91 if (ma == 2) puts("Shiro"); 92 if (ma == 3) puts("Katie"); 93 } 94 return 0; 95 }