漂亮字串

【题目描述】
Caima 认为 O 和 X 是最优美的两个字母,由 O、X 组成的串是最美的串。在这些
最优美的串中,如果任意只包含 X 的子串,长度不超过 maxX,任意只包含 O 的子串,
长度不超过 maxO,且整个串最多有 countO 个 O,countX 个 X。那么这个就是超级优
美无敌串。
现在 Caima 想知道最长的超级优美无敌串有多长,希望你告诉他。
【输入格式】
输入包含多行,至文件结束为止;
每行四个数,依次是 CountO、CountX、maxO、maxX。
【输出格式】
每组数据输出一行,一个数表示最长的超级优美无敌串的长度。
【数据规模】
0<=CountO,CountX,maxO,maxX<=1000000
【输入样例】
10 10 0 0
3 5 1 1
【输出样例】
0
7
【注意事项】
第二个样例的解释:”XOXOXOX”
最多 1000 组数据,其中 30%的数据 0<=CountO,CountX,maxO,maxX<=20,且数据组
数不超过 20 组。

模拟:

首先修正MaxO和MaxC(和count取最小值)

分成X不够和O不够的情况

否则就是CountO+CountX

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 long long CO,CX,MO,MX;
 8 int main()
 9 {
10  while (cin>>CO>>CX>>MO>>MX)
11  {
12    MX=min(MX,CX);
13    MO=min(MO,CO);
14    if (MO==0)
15      cout<<MX<<endl;
16    else if (MX==0)
17      cout<<MO<<endl;
18    else 
19   if (CO>(CX+1)*MO)
20     {
21       cout<<CX+(CX+1)*MO<<endl;
22     }
23   else if (CX>(CO+1)*MX)
24     {
25       cout<<CO+(CO+1)*MX<<endl;
26     }
27   else 
28     {
29       cout<<CX+CO<<endl;
30     }
31  }
32 }

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/7763031.html

### C++ 中字符处理的方法 在 C++ 编程中,`std::string` 是一种非常强大的工具,用于处理各种字符操作。以下是几种常用的字符处理方法及其应用场景: #### 1. 使用 `std::istringstream` 提取子字符 当需要从一个较大的字符中提取部分数据时,可以利用 `std::istringstream` 配合输入流操作符 (`>>`) 来实现[^1]。 ```cpp #include <iostream> #include <sstream> #include <string> int main() { std::string input = "John Doe 28"; std::istringstream iss(input); std::string firstName; std::string lastName; int age; iss >> firstName >> lastName >> age; std::cout << "First Name: " << firstName << "\n" << "Last Name: " << lastName << "\n" << "Age: " << age << std::endl; return 0; } ``` 这种方法适用于按空白分隔的数据提取场景。 --- #### 2. 利用 `std::string` 成员函数进行分割 对于更复杂的字符分割需求,可以直接调用 `std::string` 的成员函数,比如 `find`, `substr`, `erase` 等[^3]。 下面展示了一个简单的例子,演示如何基于逗号 `,` 对字符进行分割: ```cpp #include <iostream> #include <vector> #include <string> std::vector<std::string> split(const std::string& s, char delimiter) { std::vector<std::string> tokens; std::string token; size_t start = 0; size_t end = s.find(delimiter); while (end != std::string::npos) { token = s.substr(start, end - start); tokens.push_back(token); start = end + 1; end = s.find(delimiter, start); } tokens.push_back(s.substr(start)); return tokens; } int main() { std::string data = "apple,banana,cherry"; auto result = split(data, ','); for (const auto& item : result) { std::cout << item << std::endl; } return 0; } ``` 此代码片段展示了如何自定义一个通用的字符分割器。 --- #### 3. 替换指定位置的内容 如果需要替换某个范围内的字符或者整个字符的一部分,可以通过组合使用 `replace()` 函数完成[^3]。 ```cpp #include <iostream> #include <string> int main() { std::string text = "Hello World!"; text.replace(6, 5, "C++"); // 将 "World" 替换为 "C++" std::cout << text << std::endl; // 输出:Hello C++ return 0; } ``` 该技术非常适合于修改已有的字符内容而不创建新对象的情况。 --- #### 4. 查找并删除特定模式 有时可能希望移除某些不符合条件的部分,这可通过迭代查找擦除的方式达成目标。 ```cpp #include <iostream> #include <algorithm> #include <string> void remove_substrings(std::string& str, const std::string& to_remove) { size_t pos = str.find(to_remove); while(pos != std::string::npos){ str.erase(pos,to_remove.length()); pos=str.find(to_remove,pos); } } int main(){ std::string sentence="This is a test string with some words."; remove_substrings(sentence,"is"); std::cout<<sentence<<"\n"; // This a test string with some words. return 0; } ``` 上述程序实现了动态定位关键词并将其清除的功能。 --- #### 常见问题解答 - **Q:** 如何判断两个字符是否相等? 可以直接比较两者是否完全一致,也可以忽略大小写后再对比。 - **A:** 如果不考虑字母区分度,则需先转换成统一格式再验证[^3]。 ```cpp bool case_insensitive_compare(const std::string& lhs, const std::string& rhs) { if(lhs.size()!=rhs.size())return false; for(size_t i=0;i<lhs.size();i++)if(tolower(lhs[i])!=tolower(rhs[i]))return false; return true; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值