• Codeforces Round #724 (Div. 2) C. Diluc and Kaeya


    翻译:

    蒙德施塔特一个酒庄帝国的大亨,在任何方面都无可匹敌。法佛尼乌斯骑士团中具有异域外表的思想家。

    这一次,兄弟俩要处理的是一块刻着他们名字的奇怪木头。这块木板可以表示为一串𝑛字符。每个字符不是“D”就是“K”。您希望在这个字符串上进行一些切割(可能是0),将它划分为几个连续的片段,每个片段的长度至少为1。兄弟俩做事都很有尊严,所以他们想把木头尽可能平均地劈开。他们想知道你能把木头分成的最大块数,使每一块中出现D的次数与出现K的次数之比相等。

    Kaeya是一个好奇的思考者,他对多种场景的解决方案感兴趣。他想知道给定字符串的每个前缀的答案。帮他解决这个问题!

    对于字符串,我们将比率定义为𝑎:𝑏,其中'D'出现𝑎次,'K'出现𝑏次。注意𝑎或𝑏可以等于0,但不能同时等于0。比率𝑎:𝑏𝑐:𝑑被认为是相等当且仅当𝑎⋅𝑑=𝑏⋅𝑐。

    例如,对于字符串'DDD',比例将是3:0,对于'DKD' - 2:1,对于'DKK' - 1:2,对于' kkkdd ' - 2:4。请注意,后两个字符串的比值是相等的,但它们不等于前两个字符串的比值。

    输入
    每个测试包含多个测试用例。第一行包含测试用例的数量𝑡(1≤𝑡≤1000)。测试用例的描述如下。

    每个测试用例的第一行包含整数𝑛(1≤𝑛≤5⋅105)——木料的长度。

    每个测试用例的第二行包含一个长度为𝑛的字符串𝑠。𝑠的每个字符要么是“D”,要么是“K”。

    保证𝑛在所有测试用例上的总和不超过5⋅105。

    输出
    对于每个测试用例,输出𝑛空格分隔的整数。这些数字的𝑖-th应该等于前缀𝑠1,𝑠2,…,𝑠𝑖的答案。

    例子
    inputCopy
    5
    3.
    DDK
    6
    DDDDDD
    4
    DKDK
    1
    D
    9
    DKDKDDDDK
    outputCopy
    1 2 1
    1 2 3 4 5 6
    1 1 1 2
    1
    1 1 1 2 1 2 1 1 3
    请注意
    对于第一个测试用例,没有办法将“D”或“DDK”划分为多个具有相同数量比例的“D”和“K”的块,而您可以将“DD”划分为“D”和“D”。

    对于第二个测试用例,您可以将每个长度为𝑖的前缀分割为𝑖块“D”。

    思路:每次划分前缀,相同等比例的最大值,我们可以每次记录比例的次数,因为我们可以容易得出这样的一个结论,当D:K=1:2,等后面比例再次到达D:K=1:2,那么中间这一段也一定是D:K=1:2。所以我们每次记录前边比例的出现的次数,当前的最大的就是之前同比例的累加中最大的。

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace::std;
    15. typedef long long ll;
    16. int n,t;
    17. inline __int128 read(){
    18. __int128 x = 0, f = 1;
    19. char ch = getchar();
    20. while(ch < '0' || ch > '9'){
    21. if(ch == '-')
    22. f = -1;
    23. ch = getchar();
    24. }
    25. while(ch >= '0' && ch <= '9'){
    26. x = x * 10 + ch - '0';
    27. ch = getchar();
    28. }
    29. return x * f;
    30. }
    31. inline void print(__int128 x){
    32. if(x < 0){
    33. putchar('-');
    34. x = -x;
    35. }
    36. if(x > 9)
    37. print(x / 10);
    38. putchar(x % 10 + '0');
    39. }
    40. ll gcd(ll a,ll b)
    41. {
    42. if (b==0) {
    43. return a;
    44. }
    45. return gcd(b, a%b);
    46. }
    47. string s;
    48. void solv(){
    49. cin>>n;
    50. cin>>s;
    51. mapint, int>,int>q;
    52. int d=0,k=0;
    53. for (int i=0; i
    54. if (s[i]=='D') {
    55. d++;
    56. }
    57. if (s[i]=='K') {
    58. k++;
    59. }
    60. int jk=gcd(d, k);
    61. q[{d/jk,k/jk}]++;
    62. printf("%d ",q[{d/jk,k/jk}]);
    63. }printf("\n");
    64. }
    65. int main(){
    66. ios::sync_with_stdio(false);
    67. cin.tie(); cout.tie();
    68. cin>>t;
    69. while (t--) {
    70. solv();
    71. }
    72. return 0;
    73. }
    74.  

  • 相关阅读:
    《Attention Is All You Need》论文笔记
    k8s集群开启临时容器配置
    互联网摸鱼日报(2022-11-24)
    Java基础学习笔记(六)—— 常用API(2)
    广和通5G/4G/NB-IoT智慧水务一体化联网解决方案精准加码水利数智化
    向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss
    MySQL【存储过程与函数】
    二分查找 三分查找与二分答案
    探索前端开发新利器:MFSU
    前端 JS 经典:ES6 和 CommonJs 用法
  • 原文地址:https://blog.csdn.net/weixin_63555280/article/details/128116342