[HDU 5414] CRB and String (构造+脑洞)

本文探讨了如何通过特定操作将字符串A转换为字符串B的问题。提出了有效的算法解决方案,包括关键的检查步骤,如开头字符匹配和剩余部分的子串验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDU - 5414

给定A,B两个字符串,每次可以选择A中一个字符,
然后在其后添加一个与选择的那个字符不同的字符
问 A串是否可能构造成 B串


这是一个构造题,
看起来在 A中构造 aaaa这样连着的字符串是不行的
但实际上,假设有 A串 baaa,B串 baaaa,
我可以选择在字符 b后面添加一个 a
意识到这点以后,可以发现几乎可以任意添加字符
只要满足以下条件:
1. A字符串的开头与 B字符串的开头相等
2. A字符窜开头连续个数要大于等于 B字符串

1条件是因为只能在一个字符后面添加
所以开头如果不相同就无法构造
2条件是因为如果 A开头的连续个数大于等于 B的
那么可以在其中加一个字符把连续的断开,使之与 B的相同
而如果 B的长于 A的,那么就无法构造出开头(不能添加与前面相同的)

最后判断一下 A剩下的部分是不是 B剩下部分一个不连续的子串即可

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) ((a)*(a))

const int maxn=1e5+10;
char A[maxn], B[maxn];

int main()
{
    #ifdef LOCAL
    freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
    #endif

    int T;
    scanf("%d", &T);
    for(int ck=1; ck<=T; ck++)
    {
        scanf(" %s %s", A, B);
        int lena=strlen(A), lenb=strlen(B);
        char x=B[0];
        int cnta=0, cntb=0;
        for(int i=0; i<lena && x==A[i]; i++) cnta++;
        for(int i=0; i<lenb && x==B[i]; i++) cntb++;
        if(A[0]!=B[0] || cnta<cntb) {puts("No"); continue;}
        int np=cntb;
        for(int i=cntb; i<lenb; i++)
        {
            if(B[i] == A[np]) np++;
            if(np>=lena) break;
        }
        if(np>=lena) puts("Yes");
        else puts("No");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值