ICode9

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

题解 CF1458D 【Flip and Reverse】

2020-12-20 14:34:05  阅读:283  来源: 互联网

标签:cnt int 题解 Flip -- CF1458D 字符串 now define


题面

\(T\) 组询问,每次给定一个字符串,每次可以选择一个 10 数量相等的字符串,然后把字符串前后翻转并 01 翻转。求最后得到的字典序最小的字符串。

数据范围 : \(T, n \le 5 \times 10^5, \sum n \le 5 \times 10^5\)

题解

刚才有个群友问我 Z 菜鸡发生肾摸事了,我说怎么回事?给我发了几张 CF 分数对比图,我一看!嗷!原来是昨天,我打了一场 CF,爆零了,掉分到 newbie ,又被嘲讽了。

首先假设我们有一个 \(x\) 值,遇到 \(0\), 让 \(x\) 减少 \(1\);遇到 \(1\) 让 \(x\) 增加 \(1\)。

考虑按照原字符串建立一张图。对于每一个 \(x\) 值建立一个点。例如说现在的 \(x\) 值为 \(t\), 遇到了一个 \(1\), 然后我们从 \(t\) 到 \(t + 1\) 连一条无向边。

选择一个 10 数量相等的字符串,前后的 \(x\) 值一定相等。于是这就形成了一个环。

考虑将这个字符串取反,其实相当于从这个点绕着这个环走一圈。

然后我们要求的是这张图的最小字典序的欧拉路径。

可以考虑贪心,能向小的数走就往小数的走。

怎么判定数 \(t\) 能不能往小数 \(t - 1\) 走?首先一定要有 \(t\) 到 \(t - 1\) 的这条边,如果 \(t\) 有到 \(t + 1\) 的边那么 \(t\) 到 \(t - 1\) 的边数至少为 \(2\) (肯定要返回 \(t\))。

代码:

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = j, i##E = k; i <= i##E; i++) 
#define R(i, j, k) for(int i = j, i##E = k; i >= i##E; i--)
#define ll long long
#define ull unsigned long long 
#define db double
#define pii pair<int, int>
#define mkp make_pair
using namespace std;
const int N = 5e5 + 7;
const int inf = 1e9 + 7;
int n, cnt[N << 1];
char s[N];
void Main() {
	scanf("%s", s + 1), n = strlen(s + 1);
	int now = 0;
	L(i, 1, n) {
		if(s[i] == '1') cnt[N + now] ++, now ++; 
		else now --, cnt[N + now] ++;
	}
	now = 0;
	L(i, 1, n) {
		if(cnt[N + now - 1] > 0 && (!cnt[N + now] || cnt[N + now - 1] > 1)) --now, cnt[N + now] --, putchar('0');
		else cnt[N + now] --, now ++, putchar('1');
	}
	puts("");
	L(i, -n, n) cnt[N + i] = 0;
}
int main() {
	int T; scanf("%d", &T);
	while(T--) Main();
	return 0;
}

标签:cnt,int,题解,Flip,--,CF1458D,字符串,now,define
来源: https://www.cnblogs.com/zkyJuruo/p/14163445.html

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

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

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

ICode9版权所有