【普及二】【平衡后缀】求条(连样例都过不了,但调不出来了qaq)

#include<bits/stdc++.h>
#define N 100005
#define M 100005
#define int long long
using namespace std;
int n,k,mai,mii,f;
string s; 
char mac=0,mic=0;
map<char,int>tc;
int checkmax(int sl)
{
	mac=0;
	for(int i=0;i<sl;i++)
	{
		if(mai<=tc[s[i]])
		{
			mac=s[i];
			mai=tc[s[i]];
		}
	}
	return mai;
}
int checkmin(int sl)
{
	mic=0;
	for(int i=0;i<sl;i++)
	{
		if(mii<=tc[s[i]])
		{
			mic=s[i];
			mii=tc[s[i]];
		}
	}
	return mii;
}
signed main()
{
	cin>>n>>k>>s;
	int l=s.size();
	for(int i=0;i<l;i++)
	{
		tc[s[i]]++;
	}
	for(int i=0;i<l;i++)
	{
		f=0;
		for(int j=0;j<26;j++)
		{
			if(tc[s[i]]!=0)
			{
				tc[s[i]]--;
				if(checkmax(l)-checkmin(l)<=k)
				{
					s[i]=j+'a';
					f=1;
					break;
				}
			}	
			if(f==0){cout<<-1<<endl;break;}
		}
		if(f==0)break;
	}
	if(f==1)cout<<s<<endl;
  return 0;
}

暂时写了一个样例的代码~

7 个赞

题面呢?

7 个赞

2. 平衡后缀

XJOI - 题目ID:9737必做题100分

最新提交:0 分

历史最高:0 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

题目描述

给定长度为 n 的字符串 S 和一个整数 k。求 S 是否存在一种重排是“好的”。

一个字符串是“好的”,当且仅当:它的任意一个后缀都是“平衡的”。

一个字符串是“平衡的”,当且仅当:它的任意两个字符出现次数之差不超过 k。

注意:原串中没出现的字符不需要考虑,原串中出现过的字符在每一个后缀中都需考虑。

注意:单独一个字符构成的字符串也是“平衡的”。

如果不存在某个重排是“好的”,则输出-1。

如果存在,则输出字典序最小的重排。

输入格式

第一行一个整数 T 代表数据组数。

每组数据第一行两个整数代表 n 和 k,第二行一个只包含小写字母的字符串代表 S。

输出格式

每组数据输出一行,代表答案。

样例输入

4 3 1 aaa 4 2 baba 4 1 babb 7 2 abcbcac

样例输出

aaa aabb -1 abcabcc

数据规模

1≤�≤20001≤T≤2000,1≤�≤1051≤n≤105,1≤�≤�1≤k≤n,∑�≤2×105∑n≤2×105。
抱歉,我大号不是我的了啊啊啊!!!

5 个赞

好像很熟悉

4 个赞

当然,那不是普及二贪心第二题吗?

4 个赞

中间不是填表加判断吗? 一个是后缀的最大值和最小值

3 个赞