題意:給你3個字符串,3我的各對本身的字符串執行n輪操做,每一次選擇一個字符變爲任意一個和原來不一樣的字符。最後問你誰能使本身的串中的任意重複子串出現的次數最大化。spa
顯然只需關注字符而非子串。blog
枚舉每一個字符,盡力使其餘字符變成它。字符串
只有一種狀況須要注意!若是字符a的出現次數等於len,而且n=1,那麼你不得不將一個字符a變爲其餘的字符,最終最多隻能有len-1個a。string
#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; }