一开始看不懂题目,题意是要把w变成包含子串z的字符串!
看懂了也没思路。。。看了http://www.cnblogs.com/staginner/archive/2011/12/29/2306838.html 大神的解释才明白,bfs隐式图搜索只要保存长度<=z.size()的字符串即可,因为如果“w扩展出的字符串”包含z,那么“w扩展出的字符串”的(长度<=z.size()的)子串之一必然能扩展出z!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
const int maxstr=100000;
const int maxhash=10000;
string prd[2];
string org;
string z;
string que[maxstr];
int hashtb[maxhash];
int nextid[maxstr];
int hashv(string& str)
{
int sum=0;
for(int i=0;i<str.size();i++)
{
sum = sum*4+str[i]-'a'+1;
}
return sum%maxhash;
}
bool tryinsert(int id)// id in que
{
int h=hashv(que[id]);
int u=hashtb[h];
while(u)
{
if(que[u]==que[id])
return false;
u=nextid[u];
}
nextid[id]=hashtb[h];
hashtb[h]=id;
return true;
}
bool bfs()
{
memset(hashtb,0,sizeof(hashtb));
int front,rear;
front=1,rear=2;
string s,t;
while(front<rear)
{
s = que[front++];
if(s.find(z)!= string::npos)
return true;
string nstr;
for(int i=0;i<s.size();i++)
{
nstr+=prd[s[i]-'a'];
}
if(nstr.size() <= z.size())
{
que[rear]=nstr;
if(tryinsert(rear))
{
rear++;
}
}
else
{
for(int len=1;len<=z.size();len++)
{
for(int start=0;start+len<=nstr.size();start++)
{
string sub(nstr,start,len);
que[rear]=sub;
if(tryinsert(rear))
{
rear++;
}
}
}
}
}
return false;
}
int main()
{
freopen("input.txt","r",stdin);
char in[20];
while(scanf("%s",in)==1)
{
prd[0]=in;
cin>>prd[1]>>org>>z;
que[1]=org;
bool res=bfs();
if(res)
puts("YES");
else
puts("NO");
}
}