class Solution {
public:
typedef struct node{
string str;
int cont;
}node;
map<string,int> mp;
int ans1=10000000;
void bfs(string beginWord, string endWord,vector<string>& wordList,vector<vector<int>>& ans,vector<int>& vis1,vector<int>& vis2)
{
queue<node> q1,q2;
q1.push({beginWord,1});
q2.push({endWord,1});
while(!q1.empty() || !q2.empty())
{
int s1=q1.size();
while(s1--)
{
node tt1=q1.front();q1.pop();
int n=tt1.str.size();
string tmp;
for(int i=0;i<n;i++)
{
string s1=tt1.str.substr(0,i);
string s2=tt1.str.substr(i+1);
tmp=s1+"*"+s2;
int t1=mp[tmp];
for(int j=0;j<ans[t1].size();j++)
{
int t2=ans[t1][j];
if(vis2[t2]!=-1)
{
ans1=tt1.cont+vis2[t2];
return;
}
if(vis1[t2]==-1)
{
q1.push({wordList[t2],tt1.cont+1});
vis1[t2]=tt1.cont+1;
}
}
}
}
int s2=q2.size();
while(s2--)
{
node tt2=q2.front();q2.pop();
int n=tt2.str.size();
string tmp2;
for(int i=0;i<n;i++)
{
string s1=tt2.str.substr(0,i);
string s2=tt2.str.substr(i+1);
tmp2=s1+"*"+s2;
int t1=mp[tmp2];
for(int j=0;j<ans[t1].size();j++)
{
int t2=ans[t1][j];
if(vis1[t2]!=-1)
{
ans1=tt2.cont+vis1[t2];
return;
}
if(vis2[t2]==-1)
{
q2.push({wordList[t2],tt2.cont+1});
vis2[t2]=tt2.cont+1;
}
}
}
}
}
}
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
int n=wordList.size();
vector<vector<int>> ans(100000);
vector<int> vis1(100000,-1);
vector<int> vis2(100000,-1);
int cont=1;
int et=0;
for(int i=0;i<n;i++)
{
if(wordList[i]==beginWord) continue;
if(wordList[i]==endWord) vis2[i]=1,et=1;
int n1=wordList[i].size();
string tmp;
for(int j=0;j<n1;j++)
{
string s1=wordList[i].substr(0,j);
string s2=wordList[i].substr(j+1);
tmp=s1+"*"+s2;
if(!mp[tmp]) mp[tmp]=cont++;
ans[mp[tmp]].push_back(i);
}
}
if(!et) return 0;
bfs(beginWord,endWord,wordList,ans,vis1,vis2);
if(ans1 == 10000000) return 0;
else return ans1;
}
};