题目大意: 一个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("
");
}
return 0;
}