#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n;
ull p[41];
struct str{
vector <ull> h;
int len;
char input(){
static char c;
do c = getchar();
while (c == ' ' || c == '\n');
h.clear();
h.push_back(0);
len = 0;
while (c != ' ' && c != '\n' && c != EOF){
h.push_back(h[len] * 97 + c - 32);
len++;
c = getchar();
}
return c;
}
ull& get(){
return h[len];
}
ull substr(const int &l,const int &length){
if (l + length - 1 > len)
return 0;
return h[l + length - 1] - h[l - 1] * p[length];
}
str replace(const int &x,const int &l,const str &s){
str ans;
static int t,i;
t = s.len - l;
ans.len = len + t;
ans.h = vector <ull> (ans.len + 1);
h[0] = 0;
for (i = 1;i < x;i++)
ans.h[i] = h[i];
for (i = x + s.len;--i >= x;)
ans.h[i] = ans.h[x - 1] * p[i - x + 1] + s.h[i - x + 1];
for (i = x + s.len;i <= ans.len;i++)
ans.h[i] = ans.h[i-1] * 97 + h[i-t] - h[i-t-1] * 97;
return ans;
}
}s,e,a[7],b[7],t,r;
typedef map<pair<ull,int>,int> m;
m ma,mb;
pair <ull,int> Pair;
queue <str> qa,qb;
int extend(queue <str> &q,m &mapa,m &mapb,str a[],str b[]){
t = q.front();
q.pop();
int i,j;
for (i = 1;i <= t.len;i++)
for (j = 0;j < n;j++)
if (t.substr(i,a[j].len) == a[j].get()){
r = t.replace(i,a[j].len,b[j]);
q.push(r);
Pair = make_pair(r.get(),r.len);
mapa[Pair] = mapa[make_pair(t.get(),t.len)] + 1;
if (mapb.count(Pair))
return mapa[Pair] + mapb[Pair];
}
return -1;
}
void bfs(){
qa.push(s);
ma[make_pair(s.get(),s.len)] = 0;
qb.push(e);
mb[make_pair(e.get(),e.len)] = 0;
int ans;
while (!qa.empty() && !qb.empty()){
if (ma[make_pair(qa.front().get(),qa.front().len)] +
mb[make_pair(qb.front().get(),qb.front().len)] > 10)
break;
if (qa.size() < qb.size())
ans = extend(qa,ma,mb,a,b);
else ans = extend(qb,mb,ma,b,a);
if (~ans){
cout<<ans;
return;
}
}
cout<<"NO ANSWER!";
}
int main(){
int i;
p[0] = 1;
for (i = 1;i <= 40;i++)
p[i] = p[i - 1] * 97;
s.input();
e.input();
for (n = 0;a[n].input()!=EOF && b[n].input()!=EOF;n++);
bfs();
return 0;
}
测试点1 2 4 5 WA
但1 2在自己电脑上运行可以得到正确答案