CF1660C Get an Even String(贪心)

简介: CF1660C Get an Even String(贪心)

1.描述:


A string a=a1a2…an is called even if it consists of a concatenation (joining) of strings of length 2 consisting of the same characters. In other words, a string a is even if two conditions are satisfied at the same time:

一个字符串a是偶数串当它由相同字符组成的长度为2的字符串串联(连接)而成,换句话说,一个字符串是偶数字符串如果同时满足以下两个条件

1.its length n is even;

1.它的长度 n 是偶数

2.for all odd i (1≤i≤n−1), ai=ai+1 is satisfied.

2.对于所有的奇数字母 i 满足 ai = ai + 1;

For example, the following strings are even: “” (empty string), “tt”, “aabb”, “oooo”, and “ttrrrroouuuuuuuukk”. The following strings are not even: “aaa”, “abab” and “abba”.

例如:接下来的字符串是偶数字符串," "(空串),“tt”, “aabb”, “oooo”, and “ttrrrroouuuuuuuukk”.接下来的字符串不是偶数字符串,“aaa”, “abab” and “abba”.

Given a string s consisting of lowercase Latin letters. Find the minimum number of characters to remove from the string s to make it even. The deleted characters do not have to be consecutive.

给出一个包含小写拉丁字母的字符串,找到需要把字符串变成偶数字符串需要移除的最小字母数,删除的字符不必是连续的。


2. 输入:


The first line of input data contains an integer t (1≤t≤104) —the number of test cases in the test.


The descriptions of the test cases follow.


Each test case consists of one string s (1≤|s|≤2⋅105), where |s| — the length of the string s. The string consists of lowercase Latin letters.


It is guaranteed that the sum of |s| on all test cases does not exceed 2⋅105.


3.输出:


For each test case, print a single number — the minimum number of characters that must be removed to make s even.


4.样例输入:


6
aabbdabdccc
zyx
aaababbb
aabbcc
oaoaaaoo
bmefbmuyw


5.样例输出:


3
3
2
0
2
7


6.题目大意:


给出一个字符串,要把它变成一个偶数字符串。


7.思路


用贪心的思想,从左往右找,每找到一对可配对的就进配对,然后把前边未配对的都删掉

例如:

oaoaaaoo

位置1的o和位置3的o配对,位置2的a被删去,

位置4的a和位置5的a配对

位置7的o和位置8的o配对,位置6的a被删去


我们可以简单证明一下贪心策略的正确性:

1.adda

首先是这种要配对的元素之间有配对好的元素的情况,这种情况按照贪心策略就是删去dd,让aa配对,删去两个元素,我们如果让dd配对,那就要删去aa,删去元素个数相同,不影响结果。

同理

adcffttcda这个串,无论留下那一对偶数串最后的结果和贪心结果(删去个数)都是相同的

2.adad

其次考虑一下这种配对删去元素对后续配对有影响的情况,a和a配对删去d会对下一次d配对产生影响,但是容易看出这个串无论怎么配对其处理结果和贪心结果(删去个数)也都是相同的。

3,aspca

最后是这种最简单的情况,就是配对元素之间的元素无法跟任何元素配对,直接删去就好。


故经过我们简单的证明,可以用贪心来做


8.代码


#include<bits/stdc++.h>
using namespace std;
map<char,int>mp;
string s;
int n;
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>s;
    int len=s.size(),cnt=len;
    for(int i=0;i<len;i++)
    {
      mp[s[i]]++;//计数
      if(mp[s[i]]==2)
      {
        cnt-=2;//有一个字母配对成功,减去这个字母的长度
        mp.clear(); //清空前面字母的影响
      } 
    }
    mp.clear(); //清空map
    cout<<cnt<<endl;//所有字母减去可配对的就是要删去的
  }
  return 0;
}


9.反思


注意这种贪心策略的写法,这种模拟的写法非常值得学习


目录
相关文章
|
7月前
|
SQL
Typecho——Argument 1 passed to Typecho\Router::get() must be of the type string
Typecho——Argument 1 passed to Typecho\Router::get() must be of the type string
81 0
|
JavaScript 前端开发
How to get the query string by javascript?
1.html &lt;a href="2.html?name=geovindu&amp;sex=woman&amp;age=12"&gt;test getQueryString&lt;/a&gt; 2.html: &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/T
962 0
get string from assemble in .NET
  using System; using System.Resources;   public staticstring GetCsharpResource() {        ResourceManager r...
679 0
get string from win32 dll in .NET
using System; using System.Runtime.InteropServices;   [DllImport("kernel32")] public static extern IntPtr LoadLibr...
767 0
|
4天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
36 11
|
10天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
9天前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
|
4月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
133 2
|
5月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
109 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性