题目:输入两个只含有a、b、c的字符串,判断在通过对第一个字符串进行插入或删除aa、bb、abab后是否能变成第二个字符串
如果可以则输出yes,否则输出no
例如:ab
ba
输出 yes 因为 ab—》aababb—》ba
ac
ca
输出 no
分析: 由于插入和删除的对象只能是aa bb abab,所以如果c的数目不同,则不能转换;
可以先对字符串进行化简,也就是把所有的aa bb消去(在前一次消去后,都可能又一次出现aa bb 所以需要循环操作,如abba 消去bb后aa就在一起了又可以消去)
然后可以确定最后剩下的是abababab....或者babababa... ,abab和baba(ba相当于ab因为ba—》babb—》aababb—》ab)都可以消去,所以可以选择对4求余,看剩下的是否满足条件
易知剩下的字符数可能是0,1,2,3,如果取余后的数有一个是偶数,那么必须要两个剩下字符数目的相同,因为最后剩下的只能是ab或者ba或者空,而ab与ba是可以相互转换的
如果取余是奇数,而且字符数相同,那么只要第一个字符相同即可,因为最后只能出现a或者b或者aba或者bab
如果取余是奇数,而且字符数不同,那么只要第一个字符不同即可,因为ab与ba可以相互转换(选择后两个),然后就可以消去aa或者bb从而使剩下的字符串相互转换(易知最后剩下的是a、b、aba、bab,那么bab—》bba—》a)
#include <iostream> #include <cstdio> #include <string> #include <cstring> using namespace std; #define LL long long #define N 10005 char S[N],T[N]; string simplify(string s) //把原串化简为ababab……或者 bababa……的串 { string ans = ""; while(1) { bool flag = 1; int len = s.length(); for(int i=0;i<len;i++) { int cot = 0; for(int j=i+1;j<len;j++) { if(s[j]==s[i]) cot++,flag = 0; else break; } if(cot%2==0) ans+=s[i]; i+=cot; } if(flag) break; s = ans; ans = ""; } return ans; } int main() { while(~scanf("%s",S)) { scanf("%s",T); int c1 = 0,c2 = 0; int l1 = strlen(S); int l2 = strlen(T); for(int i=0;i<l1;i++) if(S[i]=='c') c1++; for(int i=0;i<l2;i++) if(T[i]=='c') c2++; if(c1 != c2) { //如果c的个数不等,则不能转化 puts("No"); continue; } bool flag = 0; int p1=0,p2=0; for(int i=0;i<c1;i++){ //以c为分界将字符串分解成多个小字符串,并存储起来 string s1 = "",s2 = ""; while(S[p1]!='c') { s1 += S[p1++]; } p1++; while(T[p2]!='c') { s2 += T[p2++]; } p2++; s1 = simplify(s1); //化简 s2 = simplify(s2); int len1 = s1.length()%4; // 对四取余 int len2 = s2.length()%4; if(len1%2==0 || len2%2==0) { //如果两个串的取余后的长度有一个为偶数 if(len1 != len2) { //则两个串长度必须相等,才能转化 flag = 1; break; } }else { //如果两个串的取余后的长度都为奇数 if(len1 == len2) { if(s1[0] != s2[0]){ //若长度相等,则要求两个串的第一个字符 相等 才能转换; flag = 1; break; } }else { //若长度不等,则要求两个串的第一个字符 不等 才能转换 if(s1[0] == s2[0]){ flag = 1; break; } } } } string s1 = "",s2 = ""; while(p1<l1) { s1 += S[p1++]; } while(p2<l2) { s2 += T[p2++]; } s1 = simplify(s1); s2 = simplify(s2); int len1 = s1.length()%4; int len2 = s2.length()%4; if(len1%2==0 || len2%2==0) { if(len1 != len2) { flag = 1; } }else { if(len1 == len2) { if(s1[0] != s2[0]){ flag = 1; } }else { if(s1[0] == s2[0]){ flag = 1; } } } if(flag) puts("No"); else puts("Yes"); } return 0; }