#include #include #include #include #include #include #include #define pb(a) push_back(a) using namespace std; vector velk; vector curv; char p[1100000]; int hashuj(vector v) { int res=0,nas=1; for (int i=velk.size()-1;i>=0;i--) res+=v[i]*nas, nas*=velk[i]; return res; } int t,s,m; bool seen[1100000]; void nacit(int ind) { if (ind==velk.size()) { char c='\n'; while (c=='\n') c=getchar(); int hashed=hashuj(curv); if (c=='T') t=hashed; if (c=='M') m=hashed; if (c=='S') s=hashed; p[hashed]=c; }else for (int i=0;i dehash(int h) { vector res; // cout<=0;i--) res.pb(h%velk[i]), h/=velk[i];//,cout<>dim,dim) { // cout<<"dim " <>cis, velk.push_back(cis),curv.push_back(0); reverse(velk.begin(),velk.end()); // cout<s deque > f; f.push_back(make_pair(0,t)); memset(seen,0,sizeof(seen)); int cesta=-1; while (f.size()>0) { pair top=f.front(); f.pop_front(); if (seen[top.second]||p[top.second]=='#'||p[top.second]=='M') continue; seen[top.second]=1; if (top.second==s) { cesta=top.first; break; } vector curSur=dehash(top.second); for (int i=0;i=0&&curSur[i]0) { pair top=f.front(); f.pop_front(); if (seen[top.second]||p[top.second]=='#') continue; seen[top.second]=1; if (top.second==m) { cesta2=top.first; break; } vector curSur=dehash(top.second); /* cout<=0&&curSur[i]0) { pair top=f.front(); f.pop_front(); if (seen[top.second]||p[top.second]=='#') continue; seen[top.second]=1; if (top.second==t) { cesta3=top.first; break; } vector curSur=dehash(top.second); for (int i=0;i=0&&curSur[i]