ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1493 C. K-beautiful Strings(从后往前贪心[官方题解])

2021-03-07 13:32:30  阅读:268  来源: 互联网

标签:beautiful cnt 从后 get int 题解 sum 原串 字母


LINK

另一种解法,自己的解法

转自官方题解

我们最好的答案是和原串 s s s相等

如果达不到,就看一下前 n − 1 n-1 n−1个字母是否能相等,如果还达不到就看一下前 n − 2 n-2 n−2个字母能不能相等…

于是我们从后往前枚举第 k k k个位置,判断 [ 1 , k − 1 ] [1,k-1] [1,k−1]和原串相等,在第 k k k个位置大于原串是否可行

基于这个贪心准则,我们计算一个 c n t [ i ] cnt[i] cnt[i]表示 [ 1 , k − 1 ] [1,k-1] [1,k−1]中字母 i i i的出现次数

然后计算一个 s u m sum sum表示如果 [ 1 , k − 1 ] [1,k-1] [1,k−1]和原串相等,最少需要补齐多少个字母变成 k k k的倍数

s u m = ∑ i = 0 25 ( k − c n t [ i ] % k ) % k sum=\sum\limits_{i=0}^{25}(k-cnt[i]\%k)\%k sum=i=0∑25​(k−cnt[i]%k)%k

但是第 k k k位比原串大,但是具体放哪个字母呢??

我们可以把这个字母贪心的从 s [ k ] + 1 s[k]+1 s[k]+1枚举到 ′ z ′ 'z' ′z′,看最好能放哪个字母

在第 k k k位放字母 w w w,显然需要更新 s u m sum sum,此时如果 i + s u m < = n i+sum<=n i+sum<=n说明是可行的

因为第 k k k位比较大,已经保证了字典序比较大,后续只需要满足字母是 k k k的倍数即可

没有填满的部分全部填 ′ a ′ 'a' ′a′即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int cnt[27],n,k;
string s;
int get(int x){ return (k-x%k)%k; }
int main()
{
	int t; cin >> t;
	while( t-- )
	{
		cin >> n >> k >> s;
		for(int i=0;i<n;i++)	cnt[s[i]-'a']++;
		int sum = 0, flag = 1;
		for(int i=0;i<=25;i++)	sum += get( cnt[i] );
		if( sum==0 )	cout << s << endl;
		else if( n%k!=0 )	cout << -1 << endl;	
		else
		{
			for(int i=n-1;i>=0;i--)
			{
				sum = sum-get( cnt[s[i]-'a'] )+get( --cnt[s[i]-'a'] );
				for(int j=s[i]-'a'+1;j<=25;j++)//枚举放哪个字母
				{
					int las = sum;
					sum = sum-get( cnt[j] )+get( ++cnt[j] );
					if( (i+1)+sum<=n )
					{
						for(int pos=0;pos<i;pos++)	cout << s[pos];
						cout << char( j+'a' );
						for(int pos=1;pos<=n-sum-(i+1);pos++)	cout << 'a';
						for(int w=0;w<=25;w++)
						{
							int f = get( cnt[w] );
							while( f )	f--,cout << char( w+'a' );
						}
						cout << endl; flag = 0;
						break;
					}
					cnt[j]--; sum = las;	
				}
				if( flag==0 )	break; 
			}
		}
		memset( cnt,0,sizeof cnt );
	}
}

标签:beautiful,cnt,从后,get,int,题解,sum,原串,字母
来源: https://blog.csdn.net/jziwjxjd/article/details/114481976

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有