hdu5414 CRB and String

Problem Description

CRB has two strings s and t.

In each step, CRB can select arbitrary character c of s and
insert any character d (d ≠ c)
just after it.

CRB wants to convert s to t.
But is it possible?

Input

There are multiple test cases. The first line of input contains an integer T,
indicating the number of test cases. For each test case there are two strings s and t,
one per line.

1 ≤ T ≤ 105

1 ≤ |s| ≤ |t| ≤ 105

All strings consist only of lowercase English letters.

The size of each input file will be less than 5MB.

Output

For each test case, output "Yes" if CRB can convert s to t, otherwise output "No".

Sample Input

4
a
b
cat
cats
do
do
apple
aapple

Sample Output

No
Yes
Yes
No

题意:给你两个字符串s1,s2,你可以在s1中选择任意一个字符,并且在后面添加任意与之不同的字符在后面,如果添加若干或者不添加能使s1变成s2,就输出Yes,否则输出No.

思路:只要满足两个条件就输出Yes:1.两个字符串首字母必须相等且第一个字符串中首字母连续的个数必须小于等于第二个字符。2.对于任意一个字符c,它在第一个字符串中的个数要小于等于第二个字符串的。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 100050
char s1[maxn],s2[maxn];
int num1[27],num2[27];
int main()
{
    int n,m,i,j,T,len1,len2,flag1,sum1,sum2,flag2,flag;
    char c1,c2;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s%s",s1,s2);
        if(strcmp(s1,s2)==0){
            printf("Yes\n");continue;
        }
        len1=strlen(s1);
        len2=strlen(s2);
        c1=s1[0];c2=s2[0];
        if(c1!=c2){
            printf("No\n");continue;
        }
        memset(num1,0,sizeof(num1));
        memset(num2,0,sizeof(num2));
        sum1=sum2=0;flag1=flag2=1;
        for(i=1;i<len1;i++){
            if(flag1 && s1[i]==s1[0])sum1++;
            else flag1=0;
            num1[s1[i]-'a'+1]++;
        }
        for(i=1;i<len2;i++){
            if(flag2 && s2[i]==s2[0])sum2++;
            else flag2=0;
            num2[s2[i]-'a'+1]++;
        }
        if(sum1<sum2){
            printf("No\n");continue;
        }
        flag=1;
        for(i=1;i<=26;i++){
            if(num1[i]>num2[i]){
                flag=0;break;
            }
        }
        if(flag)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

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

时间: 2024-08-14 03:27:18

hdu5414 CRB and String的相关文章

CRB and String

CRB and String 题目抽象:给你两个字符串s,t;  每次你可以从s中任选一个字符,再其后插入一个与该字符不相等的字符.经过一定的操作,是否可以是s变成t. 分析:插入一些字符,s要变成t,那么一定要满足s是t的子序列.在此基础上, 如果s[i] != t[j], 那么如果s[i-1] != t[j]或者 k>= 1, s[k -1 ] != s[k], s[k] == s[k+1] == ... == s[i]  ,那么可以插入相应的字符.如果k < 1,那么就不能在第二种情况中

构造 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

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

【HDOJ 1009】 CRB and String

[HDOJ 1009] CRB and String 每组两个串s t 只由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这种操作可以做无数次 问能不能达t 首先s能到t的首要条件是 对于任意字母 s中出现的次数小于等于t中出现的次数 其次仔细想想可以发现 满足上一条件后 只有存在连续的字符才有可能无法到达 而连续的字符如果在串中(不在串首 可不断在其前的字符后累加该字符 因此只需看t开头有没有连续的字符 如果与s开头连续的字符为相同字符 并且长度

HDU5414——字符串思维题——CRB and String

http://acm.hdu.edu.cn/showproblem.php?pid=5414 /************************************************ * Author :Powatr * Created Time :2015-8-21 10:45:46 * File Name :1009.cpp ************************************************/ #include <cstdio> #include &

hdu5414(2015多校10)--CRB and String(字符串匹配)

题目链接:pid=5414">点击打开链接 题目大意:有A.B两个字符串.如今有一种操作能够在A的随意一个字符x后面添加一个字符y(x.=y).问能不能将A变为B. 首先假设A能够变成B,那么A就一定是B的一个子序列,这个能够在O(n+m)的时间内算出. 假设A是B的子序列之后,推断添加的字符中是不是含有不能添加的情况,我们仅仅须要推断B从開始的一段连续的同样的字符串.是不是在A的开头也存在.假设存在,那么就是能够由A转化成B的. #include <cstdio> #incl

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|>

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是否连续,一直到不连续为止,那么依据上