「雜題亂刷2」CF1493C

wangmarui發表於2024-08-24

題目連結

K-beautiful Strings CF1493C

解題思路

首先,如果原字串是合法的直接輸出原字串即可。

然後我們考慮一個最簡單的暴力,你列舉第一個你構造的字串比原串大的字元的位置,再列舉這個字元,然後後面的肯定是從後往前貪心放即可,在此不再贅述。

這樣的複雜度是 \(O(|S|^2 \times V^2)\) 的,其中 \(V = 26\)\(|S|\) 代表給定的字串長度,這樣的時間複雜度並不優秀,不能透過本題,

考慮你從字尾往前掃,維護一個桶,每次向前一個字元只需要使用 \(O(1)\) 的時間複雜度修改,而從字尾往前掃,不難發現,這樣構造出來的第一個字串是一定最優的。

時間複雜度 \(O(|S| \times C^2)\),可以透過此題。

參考程式碼

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define forll(i,a,b,c) for(re ll i=a;i<=b;i+=c)
#define forrr(i,a,b,c) for(re ll i=a;i>=b;i-=c)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
ll _t_;
void _clear(){}
ll n,m;
string s;
ll a[30];
ll pd;
string ans;
ll f(char x){
	return x-'a'+1;
}
void check(ll x,char y)
{
	a[f(y)]++;
	ll need=0;
//	forl(i,1,10)
//		cout<<a[i]<<' ';
//	cout<<endl;
	forl(i,1,26)
		need+=(m-a[i]%m)%m;
//	cout<<need<<' '<<n<<' '<<x<<endl;
	if(n-x<need)
	{
		a[f(y)]--;
		return ;
	}
	pd=1;
	ans="";
	forl(i,0,n)
		ans+=' ';
	forl(i,1,x-1)
		ans[i]=s[i];
	ans[x]=y;
	ll id=0;
	forr(i,n,x+1)
	{
		ll pd2=0;
		forr(j,26,1)
			if(a[j]%m)
			{
				a[j]++,ans[i]=j+'a'-1;
				pd2=1;
				break;
			}
		if(!pd2)
		{
			id=i;
			break;
		}
	}
	forl(i,x+1,id)
		ans[i]='a';
}
void solve()
{
	ans="",pd=0; 
	_clear();
	cin>>n>>m>>s;
	if(n%m)
	{
		cout<<-1<<endl;
		return ;
	}
	s=' '+s;
	forl(i,1,26)
		a[i]=0;
	forl(i,1,n)
		a[f(s[i])]++;
	forl(i,1,26)
	{
		if(a[i]%m)
			break;
		if(i==26)
		{
			for(auto j:s)
				if(j!=' ')
					cout<<j;
			cout<<endl;
			return ;
		}
	}
/**	a[f(s[4])]--;
	a[f(s[3])]--;
	a[f(s[2])]--;
	check(2,'c');*/
	forr(i,n,1)
	{
		a[f(s[i])]--;
		forl(j,s[i]+1,'z')
		{
			check(i,j);
			if(pd)
			{
				for(auto j:ans)
					if(j!=' ')
						cout<<j;
				cout<<endl;
				return ;
			}
		}
	}
}
int main()
{
	IOS;
	_t_=1;
 	cin>>_t_;
	while(_t_--)
		solve();
	QwQ;
}