Codeforces Round #724 (Div. 2) C. Diluc and Kaeya(map暴力)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #724 (Div. 2) C. Diluc and Kaeya(map暴力)相关的知识,希望对你有一定的参考价值。

LINK

把串 s s s分为 x x x段,设每一段的 D : K = L \\rm D:K=L D:K=L,那么串 s s s D : K \\rm D:K D:K必然也为 L L L

所以对于每个前缀,只需要检验一下在比率 L \\rm L L下至多能分成几段即可

进一步的,如果 s [ 1.. i ] s[1..i] s[1..i]的比率为 L L L, s [ 1... j ] s[1...j] s[1...j]的比率为 L L L,那么 s [ i + 1... j ] s[i+1...j] s[i+1...j]的比率也必然为 L L L

所以可以贪心,一旦比率为 L L L就马上截断

暴力判断的话单次复杂度 O ( n ) O(n) O(n),显然无法通过

没办法,发现最多只有 n n n个本质不同的比例,用 m a p map map存一下

然后对每个比例暴力做一遍更新答案,这样就是调和级数的复杂度.

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
int t,n,d[maxn],k[maxn],res[maxn];
char a[maxn];
typedef pair<int,int>p;
map<p,int>mp;
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
int main()
{
	cin >> t;
	while( t-- )
	{
		mp.clear();
		scanf("%d%s",&n,a+1 );
		for(int i=1;i<=n;i++)
		{
			d[i] = d[i-1], k[i] = k[i-1]; res[i] = 1;
			if( a[i]=='D' )	d[i]++;
			if( a[i]=='K' )	k[i]++;
			int yin = gcd( d[i],k[i] );
			if( mp.count( p(d[i]/yin,k[i]/yin) ) )	continue;
			mp[ p(d[i]/yin,k[i]/yin) ] = 1;
		}
		for(auto vv:mp )
		{
			p v = vv.first;
			int D = v.first, K = v.second, ans = 0, now = 1;
			while( true )
			{
				int flag = 0;
				for(int i=1,j=now+D+K-1;j<=n;i++,j=j+D+K)
				{
					int td = d[j]-d[now-1], tk = k[j]-k[now-1];
					int yin = gcd( td,tk );
					if( td/yin!=D || tk/yin!=K )	continue;
					flag = 1, ans++, now = j+1;
					res[now-1] = max( res[now-1],ans );	
				}
				if( !flag )	break;
			}
		}
		for(int i=1;i<=n;i++)	printf("%d%c",res[i],i==n?'\\n':' ');
	}
} 

以上是关于Codeforces Round #724 (Div. 2) C. Diluc and Kaeya(map暴力)的主要内容,如果未能解决你的问题,请参考以下文章

E. Omkar and Forest——Codeforces Round #724 (Div. 2)

E. Omkar and Forest——Codeforces Round #724 (Div. 2)

F. Omkar and Akmar游戏,组合,逆元—— Codeforces Round #724 (Div. 2)

Codeforces Round #724 (Div. 2)(CD)

Codeforces Round #724 div.2 A-F题解

Codeforces Round #724 div.2 A-F题解