CF1296E2 String Coloring (hard version)

欢迎来看看呀

题目大意:给你一串长度为n的字符串,你可以给每个位置上染上一种不大于n的颜色,对于相邻的两个位置,如果他们的颜色不同则可以交换他们的位置,现在需要交换若干次后按照字典序排序,你需要找到最少满足条件的颜色数并输出方案

可以想到,只有一个字符要与另一个字符交换,才要染成不同颜色,从前往后来考虑,我们只用考虑一个字符与在它前面的字符交换就行了,因为枚举到后面需要与其交换的字符,自然会考虑到它

只有比它大的字符才会跟它交换,所以我们只需要让它与比它大的字符不同颜色即可

然后要想到这样的一个结论,这一些字符的颜色必然在\([1,x]\)这样的一个区间里,而且包含着\([1,x]\)中的每一种颜色,所以我们对于枚举到的字符,找到对应的\(x\),然后把枚举到的字符的颜色设为\(x+1\)即可

我一开始还想写权值线段树,结果一想只有26个字符,暴力就完事了,复杂度\(O(26*n)\)

代码很简单,如果有不理解的我相信看一看代码你就懂了

#include<bits/stdc++.h>
using namespace std;
int n,a[200003],maxx[200],maxxx=0,ans[200003],col;
char c;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        a[i]=c-'a'+1,maxxx=0;
        for(int j=a[i]+1;j<=26;j++)
            maxxx=max(maxxx,maxx[j]);
        ans[i]=maxxx+1,col=max(col,ans[i]);
        maxx[a[i]]=max(maxx[a[i]],maxxx+1);
    }
    cout<<col<<endl;
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<" ";
    return 0;
}

原文地址:https://www.cnblogs.com/dzice/p/12263828.html

时间: 2024-10-09 01:28:30

CF1296E2 String Coloring (hard version)的相关文章

String Coloring (hard version)

E2. String Coloring (hard version) 首先我们要明确一点,最多只会出现26种颜色,因为当下字母s[i]如果在后面s[>i]出现过,那么在 i 这个位置的最佳颜色选择即为先前确定的颜色.所以我们可以使用状态压缩来记录状态. // Created by CAD on 2020/2/5. #include <bits/stdc++.h> using namespace std; int a[200005]; int x[27]; int main() { ios

Codeforces 1296E2 - String Coloring (hard version)

题目大意: 给定一段长度为n的字符串s 你需要给每个字符进行涂色,然后相邻的不同色的字符可以进行交换 需要保证涂色后能通过相邻交换把这个字符串按照字典序排序(a~z) 你可以使用无限种颜色,但是要保证用到的颜色种类最少 从1开始对颜色进行编号,先输出最少使用的颜色种类,再给出涂色方案 解题思路 1: 可以引入一个 r 数组,开26个空间代表26种字母 这个数组 r[i] 的值代表 第 i 个字母在前面涂的颜色最大编号是多少,0表示没出现过 遍历这个字符串,再从当前字母后一个位置开始往后再遍历这个

Codeforces Round #617 (Div. 3) 题解

目录 Codeforces Round #617 (Div. 3) 题解 前言 A. Array with Odd Sum 题意 做法 程序 B. Food Buying 题意 做法 程序 C. Yet Another Walking Robot 题意 做法 程序 D. Fight with Monsters 题意 做法 程序 E1. String Coloring (easy version) 题意 做法 程序 E2. String Coloring (hard version) 题意 做法

[Codeforces Round #617 (Div. 3)] 题解 A,B,C,D,E1,E2,F

[Codeforces Round #617 (Div. 3)] 题解 A,B,C,D,E1,E2,F 1296A - Array with Odd Sum 思路: 如果一开始数组的sum和是奇数,那么直接YES, 否则:如果存在一个奇数和一个偶数,答案为YES,否则为NO 代码: int n; int a[maxn]; int main() { //freopen("D:\\code\\text\\input.txt","r",stdin); //freopen(

XML内容作为String字符串读取报错

解决方案: 1.把头信息<?xml version='1.0' encoding='UTF-8'?>,但是内容会丢失部分: 2.用XmlDocument解析就OK. 正确代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 string xmlStr = "<

从一道例题谈Arrays.toString()与其他String的转换方法

阅读该篇文章前,请大家事先阅读一下:   java.toString(),(String),String.valueOf的区别 有了上述基础后,我接下来谈谈从一道题目中获得的些许收获. 今天在做题是发现了非常重要的一点.题目来源:http://www.lintcode.com/en/problem/anagrams/ 我们先来看一下两种不同的解法: 解法一: /* use int[26] assuming it's all lowercase letters count each string

自动将String类型的XML解析成实体类

package com.mooc.freemarker2dto; public class BaseDto { } package com.mooc.freemarker2dto; public class Book extends BaseDto{ private String name; private String author; private String year; private float price; public String getName() { return name;

C# 操作xml string

//PARS request xml string xmlrequest = @"<?xml version='1.0' encoding='UTF-8'?> <Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='PARSRequest.xsd'> <Header> <MessageSentDateTime>200

lua的string.gsub初使用

今天在学习lua,熟悉项目代码的过程中,发现string.gsub好高级,所以在此mark下. 以下是lua5.1的官方文档介绍. string.gsub (s, pattern, repl [, n]) Returns a copy of s in which all occurrences of the pattern have been replaced by a replacement string specified by repl, which may be a string, a