<span>题解 CF1451B 【Non-Substring Subsequence】</span>

题目大意

给你一个长度为 \(n\) \(0/1\) 字符串,以及 \(m\) 个询问。

每个询问会告诉你一个 \(l, r\)

问你在原字符串中有没有一个子序列和子串 \(s_l \to s_r\) 一样。

题解

你考虑只改变首或者尾,看能不能找到符合要求的子序列。

我们来验证,如果首 & 尾都无法找到一样的替代。

那么你也不能找到和首/尾 \(2\) 位一样的去替代,因为第一位都没有一样的了。

反之,如果你可以找到一个字符去代替首/尾,那么他已经是一个和原串相同的子序列了。

至于怎么找,就只要记录下前面第一次出现 \(0/1\) 的位置,记录下后面第一次出现 \(0/1\) 的位置。

然后判断下就行了。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define Rep(x, a, b) for(int x = a; x <= b; ++ x)
#define Dep(x, a, b) for(int x = a; x >= b; -- x)
#define Next(i, x) for(int i = head[x]; i; i = edge[i].nxt)
int read() {
    char c = getchar(); int f = 1, x = 0;
    while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }
    while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
    return x * f;
}
char s[101];
signed main() {
	int T = read();
	while(T --) {
		int n = read(), q = read(), pla = 0, pla2 = 0, Pla = 0, Pla2 = 0;
		Rep(i, 1, n) {
			scanf("%c", &s[i]);
			if(s[i] == '0' && pla == 0) pla = i;
			else if(s[i] == '1' && pla2 == 0) pla2 = i;
		}
		Dep(i, n, 1) {
			if(s[i] == '0' && Pla == 0) Pla = i;
			else if(s[i] == '1' && Pla2 == 0) Pla2 = i;
		}
		Rep(i, 1, q) {
			int flag = 0, l = read(), r = read();
			if(s[l] == '0' && pla < l) flag = 1;
			if(s[r] == '0' && Pla > r) flag = 1;
			if(s[r] == '1' && Pla2 > r) flag = 1;
			if(s[l] == '1' && pla2 < l) flag = 1;
			if(flag) puts("YES"); else puts("NO");
		}
	}
	return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
理智的芭乐在查重:这边男朋友还有hc吗
点赞 评论 收藏
分享
10-16 19:16
Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务