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就输出NO,否则到最后肯定YES。

 1 #include <bits/stdc++.h>
 2 #define pii pair<int,int>
 3 #define INF 0x7f7f7f7f
 4 #define LL long long
 5 using namespace std;
 6 const int N=100050;
 7 char s[N];
 8 string s1, s2;
 9 bool cal(int len1,int len2)
10 {
11     if( s1[0]!=s2[0] )  return false;
12     if(len1==len2 && s1==s2 )   return true;
13     if(len1==len2 && s1!=s2 )  return false;
14
15     char c=s1[0];
16     int i;
17     for(i=0;  i<s1.size() && s1[i]==s2[i] && s1[i]==s1[0] ; i++ );//去掉前缀
18     if(s2[i]==c)    return false;   //无解
19
20     if(i==s1.size())    s1="";
21     else                s1=s1.substr(i);
22     s2=s2.substr(i);
23
24     for(int i,j; !s2.empty()  ; )
25     {
26         i=s2.size()-1;
27         j=s1.size()-1;
28         if( s1.empty() )
29         {
30             s1.push_back( s2[i]);
31             continue;
32         }
33         else if( s1[j]==s2[i] )  //相同就删
34         {
35             s1.erase(s1.end()-1);
36             s2.erase(s2.end()-1);
37         }
38         else        //不同就插
39         {
40             s1.push_back( s2[i]);
41         }
42         if(s1.size()>s2.size()) return false;
43     }
44     return true;
45 }
46
47 int main()
48 {
49     //freopen("input.txt", "r", stdin);
50     int t;
51     cin>>t;
52     while(t--)
53     {
54         scanf("%s", s );
55         s1=s;
56         scanf("%s", s );
57         s2=s;
58
59         if( cal(s1.size(),  s2.size()) )
60             puts("Yes");
61         else
62             puts("No");
63     }
64     return 0;
65 }

AC代码

时间: 2024-10-10 23:53:28

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中任意选一个字符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 (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 3973 AC&#39;s String 字符串哈希

HDU 3973 通过哈希函数将一个字符串转化为一个整数,通过特定的方式可以使得这个哈希值几乎没有冲突(这就是关键之处,几乎没有视为没有= =!, 其实也可以考虑实现哈希冲突时的处理,只是这道题没必要而已),然后使用线段树维护修改后的哈希值. 因为输入的字符串只有26个,考虑使用一个大于等于26的素数p作为进制,然后将原串转化为一个p进制的数mod 2^63(也相当于自然溢出),然后这个数存入map中,然后使用线段树维护长串区间的哈希值,hash[l, r]表示将区间[l, r]的字符串转化为p

HDU 5414(2015多校10)-CRB and String(字符串处理)

题目地址:HDU 5414 题意:要求判断字符串s能否通过添加若干个字符得到字符串t 思路:这个题看起来复杂,其实仔细一分析,成功转化只包含两种情况.第一种因为要求插入的新字符和它前面的字符c不同,如果t中有x个连续的c,那么在s中也必须有x个连续的c:第二种是s必须是t的一个不连续子串. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include

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 5202 Rikka with string(模拟)

Rikka with string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 625    Accepted Submission(s): 244 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation