传送门
Code
const int N = 5e5 + 3;
int n;
string s, ss, a[10], b[10];
queue<string> q, qq;
unordered_map<string, int> ma, mb;
int extend(queue<string>& q, unordered_map<string, int>& ma,
unordered_map<string, int>& mb, string a[], string b[])
{
string x = q.front(); q.pop();
for(int i = 0; i < n; i++)
for(int j = 0; j < sz(x); j++)
if (x.substr(j, sz(a[i])) == a[i])
{
assert(j + sz(a[i])<= sz(x);
string y = x.substr(0, j) + b[i] + x.substr(j + sz(a[i]));
if (mb.count(y)) return ma[x] + mb[y] + 1;
if (ma.count(y)) continue;
ma[y] = ma[x] + 1;
q.push(y);
}
return 11;
}
int bfs()
{
if (s == ss) return 0;
q.push(s), qq.push(ss);
ma[s] = mb[ss] = 0;
while (sz(q) && sz(qq))
{
int t;
if (sz(q) < sz(qq)) t = extend(q, ma, mb, a, b);
else t = extend(qq, mb, ma, b, a);
if (t <= 10) return t;
}
return -1;
}
int main()
{
cin >> s >> ss;
while (cin >> a[n] >> b[n])
n++;
int t = bfs();
if (t == -1) cout << "NO ANSWER!" << endl;
else cout << t << endl;
return 0;
}
|