https://codeforces.com/contest/1536/problem/C
INPUT
5
3
DDK
6
DDDDDD
4
DKDK
1
D
9
DKDKDDDDK
OUTPUT
1 2 1
1 2 3 4 5 6
1 1 1 2
1
1 1 1 2 1 2 1 1 3
题意
给T,T遍循环,给n,然后给长度为n的由DK两个字母组成的串,求串中能按要求分成的最大个数,要求是每一份中的DK的比例相同,即DDDKKKDK,可以最多分成两份,一份为DDDKKK,DK,其中两份中都为1:1;(其中一个为0也是可以的)
值得注意的是在输出有点要求,即给出n的字符串长度,则答案输出n个数,分别是第1-n前的串的可分成最大份数
比如:DDDKKK中的输出为
第一个:"D"能分成的最大份数
第二个:“DD”能分成的最大份数
第三个:“DDD”能…
第四个:“DDDK”能…
…
解法
拿上面的举例:DDDKKKDK中,可以分成两份。
当轮到第六个答案串输出时,即DDDKKK为1,此DK时比例为1:1。
当轮到第八个答案串输出时,即DDDKKKDK为2,在后两位DK的加入是不会影响前面的组合,即在相同比例下,不会因为多加其他数而影响
所以就开个map映射不同的DK比例,遇到比例就map映射值++,然后输出就输出map的映射值就好(当然要约分到最简,所以开个gcd,再让DK个数除以gcd就好)
(赛后看dalao代码的)
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b,a % b);
}
int main()
{
int t,n,g,d,k;
string s;
cin>>t;
while(t--)
{
d=0,k=0;
map<pair<int,int>,int> mp;
cin>>n>>s;
for(int i=0;i<n;i++)
{
if(s[i]=='D')
d++;
else
k++;
g = gcd(d,k);
mp[make_pair(d/g,k/g)]++;
cout<<mp[make_pair(d/g,k/g)]<<" ";
}
cout<<endl;
}
return 0;
}
如有问题请指正,虚心受教