#include <bits/stdc++.h>
using namespace std;
int dist(string a , string b){
int ret =0;
for(int i = 0 ; i<a.length(); i++){
if(a[i]!=b[i]) ret++;
if(ret>1) return ret;
}
return ret;
}
int ladderLength(string beginWord, string endWord, unordered_set<string>& wordList) {
unordered_map<string,vector<string> > adj;
vector<string> words;
for(string s : wordList) words.push_back(s);
words.push_back(beginWord);
words.push_back(endWord);
set<string> tp;
for(string s : words) tp.insert(s);
words.clear();
for(string s : tp) words.push_back(s);
for(int i = 0 ; i< words.size(); i++)
for(int j = i+1; j<words.size(); j++)
if(dist(words[i],words[j])==1){
adj[words[i]].push_back(words[j]);
adj[words[j]].push_back(words[i]);
}
unordered_map<string,int> vis;
queue<pair<string, int> > q;
q.push({beginWord,1});
vis[beginWord]=1;
while(!q.empty()){
string cur = q.front().first;
int dis = q.front().second;
q.pop();
if(cur==endWord) return dis;
for(string s : adj[cur]){
if(!vis.count(s)){
q.push({s,dis+1});
vis[s]=1;
}
}
}
return 0;
}
int main() {
unordered_set<string> s = {"hot","dot","dog","lot","log"};
cout<<ladderLength("hit","cog",s);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZGlzdChzdHJpbmcgYSAsIHN0cmluZyBiKXsKICAgIGludCByZXQgPTA7CiAgICBmb3IoaW50IGkgPSAwIDsgaTxhLmxlbmd0aCgpOyBpKyspewogICAgICAgIGlmKGFbaV0hPWJbaV0pICByZXQrKzsKICAgICAgICBpZihyZXQ+MSkgICByZXR1cm4gcmV0OwogICAgfSAgCiAgICByZXR1cm4gcmV0Owp9CmludCBsYWRkZXJMZW5ndGgoc3RyaW5nIGJlZ2luV29yZCwgc3RyaW5nIGVuZFdvcmQsIHVub3JkZXJlZF9zZXQ8c3RyaW5nPiYgd29yZExpc3QpIHsKICAgIHVub3JkZXJlZF9tYXA8c3RyaW5nLHZlY3RvcjxzdHJpbmc+ID4gYWRqOwogICAgdmVjdG9yPHN0cmluZz4gd29yZHM7CiAgICBmb3Ioc3RyaW5nIHMgOiB3b3JkTGlzdCkgICAgd29yZHMucHVzaF9iYWNrKHMpOwogICAgd29yZHMucHVzaF9iYWNrKGJlZ2luV29yZCk7CiAgICB3b3Jkcy5wdXNoX2JhY2soZW5kV29yZCk7CiAgICBzZXQ8c3RyaW5nPiB0cDsKICAgIGZvcihzdHJpbmcgcyA6IHdvcmRzKSAgIHRwLmluc2VydChzKTsKICAgIHdvcmRzLmNsZWFyKCk7CiAgICBmb3Ioc3RyaW5nIHMgOiB0cCkgIHdvcmRzLnB1c2hfYmFjayhzKTsKICAgIGZvcihpbnQgaSA9IDAgOyBpPCB3b3Jkcy5zaXplKCk7IGkrKykKICAgICAgICBmb3IoaW50IGogPSBpKzE7IGo8d29yZHMuc2l6ZSgpOyBqKyspCiAgICAgICAgICAgIGlmKGRpc3Qod29yZHNbaV0sd29yZHNbal0pPT0xKXsKICAgICAgICAgICAgICAgIGFkalt3b3Jkc1tpXV0ucHVzaF9iYWNrKHdvcmRzW2pdKTsKICAgICAgICAgICAgICAgIGFkalt3b3Jkc1tqXV0ucHVzaF9iYWNrKHdvcmRzW2ldKTsKICAgICAgICAgICAgfQogICAgdW5vcmRlcmVkX21hcDxzdHJpbmcsaW50PiB2aXM7CiAgICBxdWV1ZTxwYWlyPHN0cmluZywgaW50PiA+IHE7CiAgICBxLnB1c2goe2JlZ2luV29yZCwxfSk7CiAgICB2aXNbYmVnaW5Xb3JkXT0xOwogICAgd2hpbGUoIXEuZW1wdHkoKSl7CiAgICAgICAgc3RyaW5nIGN1ciA9IHEuZnJvbnQoKS5maXJzdDsKICAgICAgICBpbnQgZGlzID0gcS5mcm9udCgpLnNlY29uZDsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGlmKGN1cj09ZW5kV29yZCkgIHJldHVybiBkaXM7CiAgICAgICAgZm9yKHN0cmluZyBzIDogYWRqW2N1cl0pewogICAgICAgICAgICBpZighdmlzLmNvdW50KHMpKXsKICAgICAgICAgICAgICAgIHEucHVzaCh7cyxkaXMrMX0pOwogICAgICAgICAgICAgICAgdmlzW3NdPTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKSB7Cgl1bm9yZGVyZWRfc2V0PHN0cmluZz4gcyA9IHsiaG90IiwiZG90IiwiZG9nIiwibG90IiwibG9nIn07Cgljb3V0PDxsYWRkZXJMZW5ndGgoImhpdCIsImNvZyIscyk7CglyZXR1cm4gMDsKfQ==