题目大意: 一个D、K组成的字符串。求其每个前缀最多能分割成几个子串,使被分割的每个串的sumD:sumK相等。
题解:每个前缀被分割子串的sumD:sumK的值,就是整个前缀sumD:sumK的值,从左到右扫,累计答案。

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;

#define N 500001

int t;

char s[N];

int sumd[N],sumk[N];

typedef pair<int,int> PII;

int gcd(int x,int y)
{
    return y==0?x:gcd(y,x%y);
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        scanf("%s",s+1);
        map<PII,int>a;
        for(int i=1;i<=n;i++)
        {
            sumd[i]=sumd[i-1]+(s[i]=='D'?1:0);
            sumk[i]=sumk[i-1]+(s[i]=='K'?1:0);
        }
        for(int i=1;i<=n;i++)
        {
             int dd,kk;
             dd=sumd[i];
             kk=sumk[i];
             //cout<<dd<<"---"<<kk<<endl;
             int gcd_=gcd(dd,kk);
             printf("%d ",++a[make_pair(dd/gcd_,kk/gcd_)]);
        }
        printf("\n");
    }
    return 0;
}

相关文章:

  • 2021-12-09
  • 2021-06-19
  • 2021-12-14
  • 2021-09-29
  • 2022-12-23
  • 2018-11-24
  • 2021-06-01
  • 2022-02-01
猜你喜欢
  • 2021-06-26
  • 2022-12-23
  • 2021-05-31
  • 2021-08-19
  • 2022-12-23
  • 2021-06-08
  • 2021-04-25
相关资源
相似解决方案