AcWing 190. 字串变换
原题链接
中等
作者:
ZTEG
,
2019-11-09 16:22:27
,
所有人可见
,
阅读 1679
双端DFS(不是BFS)
一开始超时了一个点,感谢机房大佬的卡常优化!!!
#include<bits/stdc++.h>
using namespace std;
string x,y;
string a[10],b[10];
int tot,ans=20,ttt;
map<string,int> f;
inline void dfs(string x,int now)
{
if(now==6)
return;
f[x]=now;
map<string,int>::iterator iter=f.end();
int l1=x.size(),l2,l3;
for(register int i=0;i<tot;i++)
{
l2=a[i].size();
l3=b[i].size();
for(register int j=0;j<l1;j++)
{
string y;
if(x[j]==a[i][0])
{
int ff=1;
for(register int z=0;z<l2;z++)
if(a[i][z]!=x[j+z])
ff=0;
if(ff)
{
for(register int k=0;k<j;k++)
y+=x[k];
for(register int k=0;k<l3;k++)
y+=b[i][k];
for(register int k=j+l2;k<l1;k++)
y+=x[k];
if(f.find(y)==iter)
dfs(y,now+1);
}
}
}
}
}
inline void dfs2(string x,int now)
{
if(now==6||now>=ans)
return;
if(f.find(x)!=f.end())
ans=min(ans,f[x]+now);
int l1=x.size(),l2,l3;
for(register int i=0;i<tot;i++)
{
l2=b[i].size();
l3=a[i].size();
for(register int j=0;j<l1;j++)
{
string y;
if(x[j]==b[i][0])
{
int ff=1;
for(register int z=0;z<l2;z++)
if(b[i][z]!=x[j+z])
ff=0;
if(ff)
{
for(register int k=0;k<j;k++)
y+=x[k];
for(register int k=0;k<l3;k++)
y+=a[i][k];
for(register int k=j+l2;k<l1;k++)
y+=x[k];
dfs2(y,now+1);
}
}
}
}
}
int main()
{
cin>>x>>y;
while(cin>>a[tot]>>b[tot])
tot++;
int ss=clock();
dfs(x,0);
dfs2(y,0);
if(ans<=10)
cout<<ans<<"\n";
else
cout<<"NO ANSWER!\n";
int tt=clock();
return 0;
}
QAQ