去题面的传送门
BFS
很暴力很暴力,因为数据范围实在是太小了
wa在了hash上。
以后hash的底数还是选质数吧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int mo=2333,e=301;
int cnt,hash_A,hash_B,Ans;
int la[30],lb[30];
string A,B;
string a[10],b[10];
bool vis[100000];
struct lxt
{
int hash,num;
string s;
};
queue<lxt>q;
int bfs()
{
int lA=A.length();
int lB=B.length();
for(int i=0;i<lA;++i) hash_A=(hash_A%mo+(A[i]*e)%mo)%mo;
q.push((lxt){hash_A,0,A});
vis[hash_A]=true;
while(!q.empty())
{
string s;
s=q.front().s;
int num=q.front().num;
q.pop();
int lu=s.length();
for(int k=1;k<=cnt;++k)
{
for(int i=0;i<lu;++i)
{
int j;
for(j=0;j<la[k];++j)
if(s[i+j]!=a[k][j]) break;
if(j==la[k])
{
string ans;
int where=i;
for(int t=0;t<where;++t) ans+=s[t];
ans+=b[k];
for(int t=where+la[k];t<lu;++t) ans+=s[t];
if(ans==B)
{
if(num<10)return num+1;
return -1;
}
int hash=0;
for(int t=0;t<lu-la[k]+lb[k];++t)
hash=((hash%mo+(ans[t])%mo)*e%mo)%mo;
if(!vis[hash])
{
vis[hash]=true;
q.push((lxt){hash,num+1,ans});
}
}
}
}
}
return -1;
}
int main()
{
cin>>A>>B;
while(cin>>a[++cnt])
{
cin>>b[cnt];
la[cnt]=a[cnt].length();
lb[cnt]=b[cnt].length();
}
Ans=bfs();
if(Ans==-1) printf("NO ANSWER!");
else printf("%d",Ans);
return 0;
}