<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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-16 14:00
白火同学:其实你可以了解一下HR在Boss聊天的机制,想赢牌的前提是先会玩牌。 如果HR长时间没有理你,有可能是因为你的消息被其他应聘者的消息给挤到下面了,HR从上到下有可能只看个三四百个人就要到理想数量的简历了,而你恰好没有被看到,时间一长,你的消息在越来越下面。这种情况就需要你自己活跃一下,把消息提上去。 也可能是HR招的合适的人选了,但会一直挂着岗位,为了省重新开招聘岗位的钱,方便后面随时修改招聘要求。 当然也可能是HR吃饱了没事耍你玩,要了你的简历又不看,就看你自己怎么理解了。
点赞 评论 收藏
分享
07-16 14:10
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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