HDU_5414 CRB and String 【字符串】

一、题目

  CRB and String

二、分析

  对于这题,读懂题意非常重要。

  题目的意思是在$s$的基础上,按题目中所描述的步骤,即在$s$中任意选择一个字符$c$,在这个字符后面添加一个不等于$c$的字符$d$。

  问最终能否由$s$按步骤变成$t$。

  理解了题意后,我们就可以推导几个基本结论:

  1 $s$肯定是$t$的字串。

  2 由于是在$s$的基础上进行添加的,那么,我们可以确定除了最前面相等的$k$个串是无法添加的,后面的串都可以添加出来。如果$t$前面由相等的$k$个串,易证:$s$前面也必须由$k$个相等的串,可以结合步骤的处理了过程画一下。

  满足上述两个条件则可以由$s \to t$。

三、AC代码

 1 #include 
 2 #include 
 3 #include 
 4 
 5 using namespace std;
 6 const int maxn = 1e5 + 13;
 7 char s[maxn], t[maxn];
 8 
 9 bool solve()
10 {
11     int i, j;
12     bool flag = true;
13     for(i = j = 0; t[i] != '\0'; i++)
14     {
15         if(flag && t[i] == t[0] && s[j] != t[0])
16             break;
17         if(t[i] != t[0])
18             flag = false;
19         if(t[i] == s[j])
20             j++;
21     }
22     if(s[j] == '\0' && t[i] == '\0')
23         return true;
24     else
25         return false;
26 }
27 
28 int main()
29 {
30     //freopen("input.txt", "r", stdin);
31     int T;
32     scanf("%d", &T);
33     while(T--)
34     {
35         scanf("%s%s", &s, &t);
36         if(solve())
37         {
38             puts("Yes");
39         }
40         else
41         {
42             puts("No");
43         }
44         
45     }
46     return 0;
47 }

 

转载于:https://www.cnblogs.com/dybala21/p/11218676.html

你可能感兴趣的:(HDU_5414 CRB and String 【字符串】)