问题 H: 字串变换
时间限制: 1 Sec 内存限制: 128 MB题目描述
已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则):
A1$ -> B1$
A2$ -> B2$
规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。
例如:A$='abcd' B$='xyz'
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得 A$ 变换为B$。
A1$ -> B1$
A2$ -> B2$
规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。
例如:A$='abcd' B$='xyz'
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得 A$ 变换为B$。
输入
键盘输人文件名。文件格式如下:
A$ B$
A1$ B1$ \
A2$ B2$ |-> 变换规则
... ... /
所有字符串长度的上限为 20。
A$ B$
A1$ B1$ \
A2$ B2$ |-> 变换规则
... ... /
所有字符串长度的上限为 20。
输出
输出至屏幕。格式如下:
若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"
若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"
样例输入
abcd wyz
abc xu
ud y
y yz
样例输出
3
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
#include<set>
#include<map>
#include<deque>
#include<cstdlib>
#include<algorithm>
#define V 25
#define p 1000007
#define pp 131
#define LL long long
#define eps 1e-8
using
namespace
std;
string sd,sb,mb[1000],md[1000];
string w[V*V*V*V];
int
ans=p,id=1,ww[V*V*V*V],vis[1050007];
int
ddd=0,sbb,sdd,mbb[1000],mdd[1000];
inline
int
has(string dd)
{
unsigned
long
long
qq=0;
int
len=dd.size();
for
(
int
i=1;i<=len;i++)
qq=qq
*pp
+dd[i-1];
//cout<<qq%p<<" #$% #"<<" "<<dd<<endl;
return
%p
;
}
inline
void
bfs()
{
//cout<<V*V*V*V<<endl;
int
head,tail;
head=tail=0;
//cout<<"#$# %$"<<endl;
tail=1;
w[++head]=sd;
ww[head]=0;
string bb;
int
zz,as,len,hd,js;
int
vs=0;
while
(tail<=head)
{
bb=w[tail];
as=ww[tail];
if
(as>=10)
break
;
for
(
int
i=1;i<=id;i++)
{
hd=0;
while
(1)
{
bb=w[tail]; repalce 后自己即变 须重新设值
zz=bb.find(mb[i],hd);
if
(zz==-1)
break
;
len=mb[i].size();
string bs=bb.replace(zz,len,md[i]);
if
(bs==sb)
{
cout<<as+1;
exit
(0);
}
js=has(bs);
if
(vis[js])
{
hd=zz+1;
continue
;
}
w[++head]=bs;
vis[js]=1;
ww[head]=as+1;
hd=zz+1;
}
}
tail++;
}
}
inline
int
haha()
{
// freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);
//freopen("string.in","r",stdin);freopen("string.out","w",stdout);
cin>>sd>>sb;
sdd=has(sd);
vis[sdd]=1;
sdd=has(sb);
vis[sdd]=1;
while
(cin>>mb[id]>>md[id])
id++;
id--;
bfs();
//cout<<ans<<endl;
if
(ans<=10)
cout<<ans;
else
cout<<
"NO ANSWER!"
;
return
0;
}
int
gg=haha();
int
main()
{;}