題目大意: 一個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;
}