首页 > 其他分享 >「杂题乱刷2」CF1493C

「杂题乱刷2」CF1493C

时间:2024-08-24 23:48:25浏览次数:3  
标签:cout ll CF1493C re 字符串 杂题 复杂度 define

题目链接

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;
}

标签:cout,ll,CF1493C,re,字符串,杂题,复杂度,define
From: https://www.cnblogs.com/wangmarui/p/18378530

相关文章

  • 「杂题乱刷2」CF1567D
    duel到的。题目链接CF1567D解题思路发现在越高的数位上,你获取的利益就会越大。因此你肯定是每次将尽可能多的数分到最高的数位上是最优的。但是你会发现,有可能你这样分数位后后面的数就分不到权值了,你只需要保证去掉当前分掉的权值之后,剩下可以分的权值不小于还剩下没分到......
  • 8 月杂题记
    AT_joisc2017_c题目描述:过于复杂,略。答案明显具有单调性。考虑二分答案。有一个很自然的想法,没点燃的要向正在燃的靠近,且一定以最大速度走\(T\)秒。对于一个区间\([L,R]\),满足让它能用一个点燃的互相点燃。有一个条件为\(X_r-X_l\le2\times(r-l)\timesv\time......
  • 「杂题乱刷2」CF1183E & CF1183H
    vp到的。题目链接CF1183ESubsequences(eazyversion)CF1183HSubsequences(hardversion)解题思路考虑动态规划。设\(dp_{i,j}\)表示考虑到字符串前\(i\)个字符中选取的字符长度为\(j\)的不同的子序列数量。于是我们就有以下转移:\(dp_{i,j}=dp_{i-1,j}+dp_{......
  • 2024年8月杂题
    P3226[HNOI2012]集合选数很巧妙,原问题不好做,转化成矩阵上选择不相邻数字的方案,变成了我们熟悉的问题。[ARC068F]Solitaire难。题目的条件告诉我们最后队列里呈现“V”字形。如何计算删数的方案??找到合法方案的约束条件,用DP去计数,构造过程,都很难。[ARC068E]SnukeLine胡......
  • 杂题 Solution 速通 #1
    [ICPC2021NanjingR]AncientMagicCircleinTeyvat设\(f_x\)表示钦定至少有\(x\)条边的四元子图个数,由容斥我们有一条边都没有的子图个数是\(f_0-f_1+f_2-f_3+f_4-f_5+f_6\),而所有边都有的个数就是\(f_6\)。作差之后只需要求\(f_0,f_1,f_2,f_3,f_4,f_5\)。子图计数只......
  • 网络流部分题目及杂题选做
    网络流网络流初探A.【例题1】求最大流P3376模板。B.卖猪问题SP4063&&P4638Solution[trick]:网络流有时间顺序要求的考虑分层图,优化建图的思路很妙。D.危桥通行P3163Solution正常按照题意建边,危桥建边权为\(1\)的双向边,普通的桥建边权为\(inf\)的双向边,源点向......
  • 杂题 Solution 速通 #1
    [ICPC2021NanjingR]AncientMagicCircleinTeyvat设\(f_x\)表示钦定至少有\(x\)条边的四元子图个数,由容斥我们有一条边都没有的子图个数是\(f_0-f_1+f_2-f_3+f_4-f_5+f_6\),而所有边都有的个数就是\(f_6\)。作差之后只需要求\(f_0,f_1,f_2,f_3,f_4,f_5\)。子图计数只......
  • 杂题瞎写
    来点乱搞题。灯塔首先,这是一个DP。观察到\(\sqrt{|i-j|}\)的取值范围是\(O(\sqrtn)\)的。所以枚举每个取值,转移就是区间\(\max\)。随便写写\(O(n\sqrtn)\)。当然,这复杂度太高了,看着不舒服。我们考虑删除一些无用的状态。考虑若目前的最大值为\(val\),由于\(......
  • 「杂题乱刷2」CF1486C1 & CF1486C2
    题目链接CF1486C1CF1486C2解题思路提供一个比较显然的思路。我们发现我们可以先求出整体的最小值,然后设整体最小值所在的位置为\(id\),则我们可以通过\(1\)次询问\([1,id]\)来求出最大值的位置是在\([1,id)\)还是在\((id,n]\)。然后我们就有了整体最大值在一个前缀或......
  • 【笔记】杂题选讲 2024.8.1 下午
    [AGC018F]TwoTrees[AGC018F]TwoTrees-洛谷|计算机科学教育新生态(luogu.com.cn)先判一下奇偶性。考虑做一个很强的钦定,奇数都填\(\pm1\),偶数都填\(0\)。对于同一棵树的一棵子树,考虑对子树内两个奇数点做匹配,要求匹配上的点一个\(+1\)一个\(-1\),这样就能在子树的根......