列表

详情


NC214625. 寻找相同子序列

描述

饼神一日闲来无事决定戏耍一下王某,他给了王某一个字符串,字符串仅由0和1两种字符组成,王某观察一段时间后,饼神给出L和K两个数字,两个数字分别为饼神给出字符串的子串的左端点下标和该子串长(字符串下标从1开始,给出左下标和长度的子串后面叫做Str1),你需要回答饼神给出的字符串中是否还存在子序列与Str1相等(不可为同一个字符串),有则输出YES,没有输出NO。

输入描述

第一行一个正整数T表示测试数据组数(1≤T≤103)。

接下来每一组包含两行
第一行输入一个字符串(字符串长度为n,1<=n<=10000)
第二行输入L,K,L为子串左端下标,K为子串长度(1<=L<=n,L+k<=n)

输出描述

输出T行,每行输出YES或NO,表示答案。

示例1

输入:

3
10010010
4 2
001001010
6 3
0110000000
2 2

输出:

YES
NO
NO

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 7ms, 内存消耗: 376K, 提交时间: 2021-03-13 23:08:49

#include<stdio.h>
#include<string.h>
int main()
{
	int t,n,l,k,i,j,m;
	scanf("%d",&t);
	while(t--)
	{
		m=0;
	char a[10005],b[10005];
	scanf("%s",a);
	scanf("%d%d",&l,&k);
	n=strlen(a);
	for(i=l-1,j=0;i<l+k-1;i++,j++)
	{
		b[j]=a[i];
	}
	b[j]='\0';
	for(i=0;i<l-1;i++)
	{
		
		if(a[i]==b[0])
		{
				m=1;
				break;
			}
    }
    for(i=l+k-1;i<n;i++)
    {
		
		if(a[i]==b[k-1])
		{
				m++;
				break;
			}
    }
    if(m==1||m==2) printf("YES\n");
    else printf("NO\n");
    }
	return 0;
}

 

C++(clang++11) 解法, 执行用时: 6ms, 内存消耗: 496K, 提交时间: 2021-03-30 20:37:32

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
	char a[100000];
	int i, j=0, k,l,n,p,t,b;
	cin >> t;
	for (b = 0; b <t; b++)
	{
		p = 0;
		cin >> a;
		cin >> l >> k;
		n = strlen(a);

		for (i = 0; i < l - 1; i++)
		{
			if (a[i] == a[l - 1])p = 1;

		}
		for (j = n - 1; j > l + k - 2; j--)
		{
			if (a[j] == a[l + k - 2])p = 1;
		}

		if (p == 1)cout << "YES"<<endl;
		else cout << "NO"<<endl;

	}
	return 0;
}

上一题