CF1536C - Diluc and Kaeya(数据结构 + 数学规律 / 提高级)

1536C - Diluc and Kaeya(源地址自⇔CF1536C


tag

⇔数据结构、⇔数学规律、⇔提高级(*1500)

题意

给出一串长度为 \(n\) 的仅包含 \(\tt{}D\)\(\tt{}K\) 的字符串,规定操作如下:

  • 你可以将其分为多个连续子串,当且仅当子串中 \(\tt{}D\)\(\tt{}K\) 的个数比两两相等。

求解所有前缀子串最多可以分为的个数。

思路

容易发现规律如下:

  • 当这个字符串中 \(\tt{}D\)\(\tt{}K\) 数量互质的时候,答案为 \(1\)
  • 不互质时,又分为以下两种情况:
    • 当比值 \(\tt{}D : K\) 第一次出现,答案为 \(1\) ;
    • 当比值 \(\tt{}D : K\) 非第一次出现,答案即为该比值出现的次数。

AC代码

点击查看代码
//A WIDA Project
#include <bits/stdc++.h>
using namespace std;
void solve();
int main()
{
    int T; cin >> T;
    while(T -- ) solve(), cout << endl;
    return 0;
}
void solve()
{
    map<pair<int, int>, int> mp;
    int n; string s; cin >> n >> s;
    
    int x = 0, y = 0;
    for (int i = 0; i < n; ++ i) {
        if(s[i] == 'D') ++ x;
        else ++ y;
        int num = __gcd(x, y);
        int xx = x / num, yy = y / num;
        mp[{xx, yy}] ++ ;
        cout << mp[{xx, yy}] << " ";
    }
}

错误次数

(赛时1,2)没有找到 \(\tt{}map\) 数组与答案之间的关系,输出答案错误。


文 / WIDA
2022.03.03成文
首发于WIDA个人博客,仅供学习讨论


更新日记:
2022.03.03成文


posted @ 2022-03-03 22:10  hh2048  阅读(87)  评论(0编辑  收藏  举报