C. Binary String Copying
题意(机翻)
给您一个字符串 s s s ,由 n n n 个字符 0 和/或 1 组成。
您为此字符串制作了 m m m 个副本,令第 i i i 个副本为字符串 t i t_i ti 。然后,您对每个副本执行一次操作:对于第 i i i 个副本,对其子字符串 [ l i ; r i ] [l_i; r_i] [li;ri] 进行排序(从第 l i l_i li 个字符到第 r i r_i ri 个字符的子字符串) ,包括两个端点)。 注意,每个操作仅影响一个副本,每个副本仅受一个操作影响。
您的任务是计算 t 1 , t 2 , … , t m t_1, t_2, \ldots, t_m t1,t2,…,tm 中不同字符串的数量。请注意,只有在操作后至少有一个副本保持不变的情况下,才应计算初始字符串 s s s 。
思路
一开始我想统计上升的元素数量和不上升元素的数量结果发现不对,经过题解的指导,应该记录元素确定为有序也就是已经是单调上升的了的最后一个元素数量,和无序数列的最后一个的位置(在序列的位置),记录序列的长度
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e6 + 10;
const double eps = 1e-8;
int n;
void solve()
{
string s;
cin >> s;
int flag = 0;
int firstid = 0, secondid = 0,cnt = 0;
for (int i = 0; i < s.size(); i ++)
{
//如果要加元素,两个值不会发生变化
if(s[i] == '+') cnt ++;
//如果要减元素,如果剩余元素数量比无序数列的元素数量小了那就没有无需的元素了将其变为空
//如果比有序的数量少,证明有序元素数量减少
else if (s[i] == '-')
{
cnt --;
if(firstid > cnt) firstid = cnt;
if(secondid > cnt) secondid = 0;
}
//如果为无需的那么有序的数量一定要比数列中元素数量小,1个元素证明是有序的
else if (s[i] == '0')
{
if(firstid == cnt || cnt < 2)
{
flag = 1;
break;
}
//只有没有无序元素的时候才将其变为无序的第一个出现位置
if(secondid == 0)secondid = cnt;
}
//如果序列是有序的那么无序的元素一定没有也就是0个
else
{
if(secondid != 0){
flag = 1;
break;
}
firstid = cnt;
}
}
if(flag) puts("NO");
else puts("YES");
}
int main()
{
int t;cin >> t;
while(t --) solve();
return 0;
}