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

题目大意: 一个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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章