hdu 5414 CRB and String(想法题)

题意:

给你两个字符串s和t,你可以在字符串s中任意选一个字符c,在该字符c后插入一个字符d(d!=c),问经过多次此操作,能否将字符串s转化成字符串t。

解析:

不要想太复杂了,分情况讨论清楚就好了。

1. 如果|s|>|t|,那么无论怎么组合都是无法构成t的。

2. 如果s[0]!=t[0],无论怎么组合,也都是无法构成t的。

3. 以上两种情况比较好考虑,然后找两个串的最长公共前缀。

如果s的最长公共前缀等于|t|则表明两个字符串完全相同,这种看情况可以构造出t,因为上面已经排除了|s|>|t|的情况了。

4. 由于插在后面的字符不能和其前面的字符相同,那么判断一下两个字符串的公共前缀,是不是全部都是一个字母,如果全部是一个字母,那么如果当前要插入的字符是和前面字符相同,那么就无法构造出t。

5. 排除了4这种情况,那么就可以任意构造出想要的字符串了,因为如果不同,就可以随意构造后面的字符,相同的话,就可以在前面不同的字符后面插入一个字符,等于构造出一个相同的字符。

那么相同的话两个指针一同向前推进,否则t的指针向前推进,判断最后s是否有剩余。

my code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N = (int)1e5 + 10;
char pat[N], tar[N];

bool judge() {
    int lenP = strlen(pat), lenT = strlen(tar);
    if(pat[0] != tar[0] || lenP > lenT)
        return false;

    int i = 0, j = 0;
    bool diff = false;
    while(i < lenP) {
        if(pat[i] == tar[j])
            i++, j++;
        else break;
        if(i > 1 && pat[i-1] != pat[i-2])
            diff = true;
    }

    if(i == lenT) return true;
    if(!diff && tar[j] == tar[j-1])
        return false;

    while(j < lenT) {
        if(pat[i] == tar[j]) i++;
        j++;
    }
    if(i == lenP) return true;
    return false;
}

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%s%s", pat, tar);
        puts(judge() ? "Yes" : "No");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-21 19:32:37

hdu 5414 CRB and String(想法题)的相关文章

hdu 5414 CRB and String (贪心)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5414 题意:给定字符串s和t,可以在s里面选一个字符c,然后任选一个字符d(d!=c)将d插入到c的后面,问能不能将s变为t. 分析:先考虑可以插的字符(串)的情况,若在字符串"sd"的字符s后面插字符串p(|p|>=1),只要p[0]!='s'就行,比如p="oola",第一个o插在's'后面,第二个也插在's'后面,是可以的.那么对s和t里面的字符进行匹配,并且是

HDU 5414 CRB and String (字符串,模拟)

题意:给两个字符串s和t,如果能插入一些字符使得s=t,则输出yes,否则输出no.插入规则:在s中选定一个字符c,可以在其后面插入一个字符k,只要k!=c即可. 思路:特殊的情况就是s和t的最长相同字符的前缀不等长,则肯定插不进去,如s="aab",而t="aaab".还有就是,如果第一个字符就不相同了,输出NO,因为不能在最前面插入(看定义)! 只要将这个情况排除掉,其他的就好做了,从后面开始,匹配就往前扫,不匹配就在s中插入对应字符,如果s长度超过了t就输出N

HDU 5414 CRB and String (2015年多校比赛第10场)

1.题目描写叙述:点击打开链接 2.解题思路:本题要求推断字符串s是否能通过加入若干个字符得到字符串t. 首先,能够知道,s必须是t的一个子串(注意:不是连续子串). 第二.因为插入的新字符和它前面的字符c不同.因此假设t中有cnt个连续的c.那么在s中也必须有cnt个连续的c.因此.仅仅要能够满足这2个条件,就一定能够成功实现转化. 那么该怎样做呢?两者能够结合起来推断,用i,j分别表示s,t串中当前扫描的字符的下标.首先从字符串t開始扫描,看第一个字符c是否连续,一直到不连续为止,那么依据上

HDU 5414 CRB and String

题意:给两个字符串a,b,问是否可以将a串变成b串.只有一种操作,即选择a串的一格字符c,在c后面添加一个字符d,要求d和c不同.操作可以进行很多次,也可以不进行.保证a,b非空且a的长度不过b的长度. 解法:(千万别想麻烦了)显然如果第一个字符不同,就无解:设两个指针t1,t2分别指向a,b,t1 t2 从0开始扫,发现不同则退出,发现s2[t2 - 1] != s2[t2] (t2 > 0) 则退出..此时如果t2指向len2则有解,如果t2指向0则无解,如果s2[t2 - 1] == s2

构造 HDOJ 5414 CRB and String

题目传送门 题意:给两个字符串s,t,可以在s字符串任意位置后面插入字符c(与前面的不同),问是否能够将s转换为t字符串 构造:首先lens > lent 或者 s[1] != t[1] 一定是No,然后t最前面相同字符长度的部分在s中要相同,否则不能插入,之后的部分只要相同的部分全部存在,不同的部分可以随便插 /************************************************* Author        :Running_Time* Created Time

HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出,选择跳过的题,简称想法题. 首先考虑区间的更新方法:区间左端l不动,右端r滑动, 滑到有k个数>=m时,此区间符合条件,并且发现右端点再往右滑到底,此条件一直符合(因为若加入的数小于"第K大的数",则毫无影响.若不然,加入该数会产生一个新的第k大数,保证>="第K大

HDOJ 5414 CRB and String 模拟

CRB and String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 491    Accepted Submission(s): 186 Problem Description CRB has two strings s and t. In each step, CRB can select arbitrary charact

HDU 4972 Bisharp and Charizard 想法题

Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He loves James and Miami Heat. Here's an introduction of basketball game:http://en.wikipedia.org/wiki/Basketball. However the game in Dragon's version i

HDOJ(HDU) 2137 circumgyrate the string(此题用Java-AC不过!坑)

此题如果有用JavaACDSee,请评论,谢谢了. Problem Description Give you a string, just circumgyrate. The number N means you just circumgyrate the string N times, and each time you circumgyrate the string for 45 degree anticlockwise. Input In each case there is string