HDU_5414 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 <cstdio> 2 #include <iostream> 3 #include <cstring> 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 }

浙公网安备 33010602011771号