[cpp] 描述:題意很簡單,不過要是想要通過看題明白確實挺麻煩的,就是給你一個開始字符串w和最終字符串z,字符串中只有a與b,如果遇到a就替換成第一個字符串,遇到b就替換成第二個字符串,問這樣的替換方式能否構成一個形如 xzy 的字符串(x,y,可為空); #include <iostream> #include <cstdio> #include <cstring> #include <map> #include <string> using namespace std; #define MAX 130000 map<string,int> hash; string a,b,w,z,s[MAX]; int flag,rear=1,front=0; void judge(string &p) { for(int i=0; i<p.size(); i++) { string str=""; for(int j=i; j<i+z.size()&&j<p.size(); j++) str+=p[j]; if(str==z) { printf("YES\n"); flag=1; return; } if(!hash[str]) { hash[str]=1; s[rear++]=str; } } } void bfs() { hash.clear(); s[0]=w; hash[w]=rear=1; front=0; if(s[front].size()>=z.size()) judge(s[front]); if(!flag) while(front<rear) { string str=""; for(int i=0; i<s[front].size(); i++) if(s[front][i]=='a') str+=a; else str+=b; judge(str); if(flag) return; front++; } } int main() { #ifndef ONLINE_JUDGE freopen("a.txt", "r", stdin); #endif while(cin>>a>>b>>w>>z) { flag=0; bfs(); if(!flag) printf("NO\n"); } return 0; }