P1032 字串变换
bfs,把能换的全部换掉然后入队即可。
#include<iostream>
#include<map>
#include<unordered_map>
#include<queue>
#include<vector>
using namespace std;
#define PSI pair<string, int>
#define PSS pair<string, string>
vector<PSS> ss;
unordered_map<string, int> st;
string a, b;
vector<int> find(const string &a, const string &b){
vector<int> res;
int j = 0;
for(int i = 0; i < a.size(); i ++){
if(j == b.size()) res.push_back(i - j);
if(j < b.size() && a[i] == b[j]) j ++;
else i = i - j, j = 0;
}
if(j == b.size()) res.push_back(a.size() - j);
return res;
}
int bfs(){
queue<PSI> q;
q.push({a, 0});
while(q.size()){
auto h = q.front();
q.pop();
for(auto t : ss){
vector<int> k = find(h.first, t.first);
for(int i = 0; i < k.size(); i ++){
string temp = h.first;
temp = temp.replace(k[i], t.first.size(), t.second);
if(st[temp] == 0){
st[temp] = 1;
q.push({temp, h.second + 1});
if(temp == b || h.second + 1 > 10) return h.second + 1;
}
}
}
}
}
int main(){
cin >> a >> b;
string p, q;
while(cin >> p >> q) ss.push_back({p, q});
int k = bfs();
if(k > 10) puts("NO ANSWER!");
else cout << k << endl;
return 0;
}