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

Author

KUT(DPRK)

Source

2015 Multi-University Training Contest 10

/* ***********************************************
Author        :CKboss
Created Time  :2015年08月21日 星期五 09时23分23秒
File Name     :HDOJ5414.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

const int maxn=100100;

int n,m;
int pip[maxn];
char S[maxn],T[maxn];

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

    int T_T;
    scanf("%d",&T_T);
    while(T_T--)
    {
        scanf("%s",S);
        scanf("%s",T);
        n=strlen(S); m=strlen(T);
        if(n>m) { puts("No"); }
        else if(n==m)
        {
            if(strcmp(S,T)==0) puts("Yes");
            else puts("No");
        }
        else
        {
            T[m]='&';
            bool flag=true;
			if(S[0]!=T[0]) flag=false;
            for(int i=0;i<n&&flag;i++)
            {
                bool temp=false;
                int st=0;
                if(i) st=pip[i-1]+1;
                for(int j=st;j<m;j++)
                {
                    if(S[i]==T[j]&&S[i]!=T[j+1])
                    {
                        /// find a point
                        pip[i]=j;
                        /// go back
                        int ni=i+1;
                        int ed=0;
                        if(i) ed=pip[i-1]+1;
                        for(int k=pip[i]-1;k>=ed;k--)
                        {
                            if(T[k]==S[ni])
			    {
				pip[ni]=pip[i];
				ni++;
			    }
                            else break;
                        }
                        i=ni-1;
                        temp=true; break;
                    }
                }
                if(temp==false) flag=false;
            }

            /// spc judge start point
            if(pip[0]!=0&&flag)
            {
                int len=1;
                for(int i=1;i<n;i++)
                {
                    if(S[i]==S[0]&&pip[0]==pip[i]&&len<pip[0]+1) len++;
                    else break;
                }
            	if(len!=pip[0]+1) flag=false;
            }

            if(flag==true) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}
时间: 2024-10-25 22:54:38

HDOJ 5414 CRB and String 模拟的相关文章

构造 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 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(想法题)

题意: 给你两个字符串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 (贪心)

题目: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 (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 1009】 CRB and String

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

背包DP HDOJ 5410 CRB and His Birthday

题目传送门 题意:有n个商店,有m金钱,一个商店买x件商品需要x*w[i]的金钱,得到a[i] * x + b[i]件商品(x > 0),问最多能买到多少件商品 01背包+完全背包:首先x == 1时,得到a[i] + b[i],若再买得到的是a[i],那么x == 1的情况用01背包思想,x > 1时就是在01的基础上的完全背包.背包dp没刷过专题,这么简单的题也做不出来:( /************************************************* Author

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,那么就不能在第二种情况中