首页 > 其他分享 >codeforces刷题(1100):1864B_div1+div2

codeforces刷题(1100):1864B_div1+div2

时间:2023-12-29 23:55:06浏览次数:31  
标签:字符 奇偶 int 奇数 codeforces 改变 1864B 1100 操作

B、Swap and Reverse

跳转原题点击此:该题地址

1、题目大意

  给你一个字符串和k,你可以对该字符串做一下两个操作:

  1. 交换\(a_i\) 和 \(a_{i+2}\)的字符;
  2. 对 \([i, i+k-1]\) 这个区间的字符就行反转;
    问你通过这两个操作后,原字符串所能生成新的字典序最小的字符串是什么。

2、题目解析

  我们发现,操作一是对同奇同偶下标的字符进行交换。而操作二则随着k的奇偶而改变:

  1. 当k是奇数时,与操作一类似,只能对同奇同偶下标的字符进行交换,例如:当k为3时,只能对 \([i, i + 2]\) 这个区间交换,原数的奇偶不会发生改变,所以奇数下标和偶数下标的字符分别按照字典序排序。
  2. 当k是偶数时,我们发现当对\([i, i + k - 1]\) 和 \([i + 1, i + k]\)这个两个区间进行反转时,\(a_{i+k-1}\) 和 \(a_{i+k}\)这两个字符下标的奇偶发生了改变,而其余字符不改变。此时我们就能通过k为奇数时的操作改变新的字符。所以可以通过若干次操作一和操作二达到所有字符按照字典序排序。
    举例:\([1,2,3,4,5]\),\(k = 4\),两次反转后结果为\([4,5,1,2,3]\),我们发现,4和5的奇偶下标被改变了,其余字符的下标依旧。
#include<bits/stdc++.h>

using namespace std;

const int N = 2e5+10;
int T;
int n, k;
string s;

void solve()
{
	cin >> n >> k;
	cin >> s;
	// 如果是偶数,可以通过[i, i + k - 1]和[i + 1, i + k]来改变第i+k-1和第i+k位两个元素的奇偶位
	// 然后就能通过k为奇数时的操作来改变位置
	if(! (k & 1))
	{
		sort(s.begin(), s.end());
		cout << s << endl;
	}
	// 如果是奇数,无论是哪种操作,奇数位只能和奇数位交换,偶数位同理
	else
	{
		string t[2];
		for(int i = 0; i < s.size(); i++)
			t[i % 2] += s[i];
		// 奇偶分别排序
		sort(t[0].begin(), t[0].end());
		sort(t[1].begin(), t[1].end());
		
		for(int i = 0; i < t[0].size(); i++)
		{
			cout << t[0][i];
			if(i < t[1].size())	// 存入偶数位的字符,因为字符串的奇数长度一定大于等于偶数长度
				cout << t[1][i];
		}
		cout << endl;
	}
}

int main()
{
	cin >> T;
	while (T--)
	{
		solve();
	}

	return 0;
}

 

标签:字符,奇偶,int,奇数,codeforces,改变,1864B,1100,操作
From: https://www.cnblogs.com/Tom-catlll/p/17935894.html

相关文章

  • Codeforces 1876G Clubstep.md
    首先考虑暴力的贪心。从\(r\)到\(l\)依次遍历,若\(a_i<x\)则一直进行题目中的操作。正确性是能保证的,因为选后面的\(j\)只能\(+1\),而选\(i\)可以\(+2\),且\(i\)前面的部分都是\(+1\)。考虑转化一下,把对\(i\)进行操作\(k\)次后,\(\forallj\in[1,i),a_j\l......
  • Codeforces Round 918 (Div. 4)赛后总结(前缀和)(set部分用法)
    CodeforcesRound918(Div.4)赛后总结a,b题没啥好说的c题典中典没开longlong一回事,还有判断数a是否为完全平方数直接用sqrt(a)\(^2\)=a的判断就可以d题经典字符串问题首先,我们以一个字符数组的形式存数据。再根据已知cv,cvc两种形式,我们只需要判断c的时候看v是否有用过(可......
  • Codeforces Round 887 (Div. 1)
    CodeforcesRound887(Div.1)A先来个二分。注意到这样一件事:考虑是\(a_i\)失效的最小时间\(t_i\),发现\(t\)有单调性。所以从大到小考虑\(a\),每次相当于将二分的值减去一个值,复杂度\(O(\sumn(\logn+\logk))\)。codeconstintN=2e5+10;intn;llk;lla......
  • Codeforces Round #843 (Div. 2)
    安利一个叫codeforcesbetter的插件  https://greasyfork.org/zh-CN/scripts/465777-codeforces-better今天装了后使用cf体验非常舒适=====A.GardenerandtheCapybaras(easyversion)问字符串s能否切分成3个字符串a、b、c,且满足a<=b&&c<=b或者b>=a&&b>=cs长度<=100,暴力......
  • [Codeforces] CF1538F Interesting Function
    CF1538FInterestingFunction题目传送门题意给定两个正整数\(l,r\)(\(l<r\)),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。位数变化指:\(l=909\),将\(l+1\)后有\(2\)位数字发生变化。\(l=9\),将\(l+1\)后也有\(2\)位数字发生变......
  • codeforces比赛(1):codeforces 918_div4
    A、OddOneOut跳转原题点击此:A题地址1、题目大意  给你三个数,其中两个是相等的,问你还有一个不相等的数是多少。2、题目解析  直接暴力枚举即可,只要找到两个数相等,那么答案就是另一个数。#include<bits/stdc++.h>usingnamespacestd;intT;inta,b,c;voidsol......
  • Codeforces Round 917 (Div. 2)
    A.LeastProduct存在\(a[i]=0\),\(min=0\),不需要任何操作。负数个数为偶数(包括0),\(min=0\),把任意一个改为\(0\)。负数个数为奇数,\(min=\proda[i]\),不需要任何操作。voidsolve(){ intn; cin>>n; vector<int>b,c,d; for(inti=0;i<n;++i){ in......
  • [Codeforces] CF1536C Diluc and Kaeya
    CF1536CDilucandKaeya题意题目传送门给你一个字符串\(S\),其中只包含'K'或'D'两种字符,要求划分这个字符串使得各部分的\(n(D):n(K)\)相同,其中\(n(D)\)表示\(S\)中字符'D'出现的个数,最大化划分后形成的组数。求出\(S\)的所有前缀中的上述答案。思路注意到,如......
  • codeforces刷题(1100):1901B_div2
    B、ChipandRibbon跳转原题点击此:该题地址1、题目大意  存在一条由n个单元格组成的带子。chip可以做两个操作:1、由\(i\)走到\(i+1\),但是不能走到\(i-1\);2、可以传送到任意位置,包括传送到原地。每到一个单元格,该单元格的数值+1(初始为0)。最开始chip在从第一格开始走起(题......
  • codeforces刷题(1100):1902B_div2
    B、GettingPoints跳转原题点击此:该题地址1、题目大意  Monocarp为了完成总共n天的某学期的p学分任务。Monocarp每天可以选择两种度过方式:上一次课和完成最多两个任务或者休息一天。其中上课获得l学分,每个任务获得t学分,其中任务不可以重复接取,并且每周获得一个新的任务(第一......