一开始输入四个字符串(都是只含a,b),第三串是初始字符串,第四串是目标字符串,变化方式是把第三串中出现a就替换成第一串,出现b就替换成第二串。问新字符创的子集中(也就是截断出目标字符串长度)含不含目标字符串。
做法就是妹子都把ab全变完后,截断出目标字符串长度的所有子集,判断有没有满足的,满足就结束。 不满足,并且没有出现过,就入队列。
AC代码:
#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;
string a;
string b;
string beg;
string target;
string s,s1;
bool ok;
queue<string> q;
map<string ,int> m;
void judge (string temp) {
for (int i = 0; i < temp.size() - 1 ;i++) {
string temp2 = "";
for (int j = i ; j < i + target.size() && j < temp.size() ;j++) {
temp2 += temp[j];
}
if(temp2 == target) {
ok = true;
return ;
}
else {
if (!m[temp2]) {
q.push(temp2);
m[temp2] = 1;
}
}
}
}
void bfs () {
ok = false;
while(!q.empty()) {
q.pop();
}
m.clear();
s = beg;
m[s] = 1;
q.push(s);
if (beg.size() >= target.size())
judge(beg);
if(ok)
return;
while (!q.empty()) {
s = q.front();
q.pop();
string temp = "";
for (int i = 0 ; i < s.size() ;i++) {
if (s[i] == 'a')
temp += a;
if (s[i] == 'b')
temp += b;
}
judge(temp);
if (ok)
return;
}
}
int main () {
while (cin >> a) {
cin >> b >> beg >> target;
bfs();
if(ok)
cout << "YES"<<endl;
else
cout << "NO"<<endl;
}
return 0;
}