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成文