【枚举】【贪心】Codeforces Round #482 (Div. 2) B. Treasure Hunt
题意:给你3个字符串,3个人各对自己的字符串执行n轮操作,每一次选择一个字符变为任意一个和原来不同的字符。最后问你谁能使自己的串中的任意重复子串出现的次数最大化。
显然只需关注字符而非子串。
枚举每个字符,尽力使其他字符变成它。
只有一种情况需要注意!如果字符a的出现次数等于len,并且n=1,那么你不得不将一个字符a变为其他的字符,最终最多只能有len-1个a。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n; char a[4][100005]; int b[4][305],A[4],len; int main(){ scanf("%d",&n); for(int i=1;i<=3;++i){ scanf("%s",a[i]+1); len=strlen(a[i]+1); for(int j=1;j<=len;++j){ ++b[i][a[i][j]]; } } for(int i=1;i<=3;++i){ for(int j='A';j<='Z';++j){ if(n<=len-b[i][j]){ A[i]=max(A[i],b[i][j]+n); } else if(b[i][j]==len && n==1){ A[i]=max(A[i],len-1); } else{ A[i]=max(A[i],len); } } for(int j='a';j<='z';++j){ if(n<=len-b[i][j]){ A[i]=max(A[i],b[i][j]+n); } else if(b[i][j]==len && n==1){ A[i]=max(A[i],len-1); } else{ A[i]=max(A[i],len); } } } if(A[1]>A[2] && A[1]>A[3]){ puts("Kuro"); } else if(A[2]>A[1] && A[2]>A[3]){ puts("Shiro"); } else if(A[3]>A[1] && A[3]>A[2]){ puts("Katie"); } else{ puts("Draw"); } return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/