SHARE
TWEET

Untitled

a guest Sep 22nd, 2019 75 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define mp make_pair
  5. #define ll long long
  6. #define pii pair <int,int>
  7. #define pb push_back
  8.  
  9. using namespace std;
  10. int n,m; string pr,su;
  11. int di[]={1,-1,0,0};
  12. int dj[]={0,0,-1,1};
  13. char inp[205][205];
  14. bool yes[205],viss[205][205][205],visp[205][205][205];
  15. int ans[205][205];
  16. void dfsp(int _i,int _j,int nw){
  17.     visp[_i][_j][nw]=true;
  18.     if (nw==(pr.length()-1)) return;
  19.     for (int i=0;i<4;i++){
  20.         int tmpi=_i+di[i],tmpj=_j+dj[i];
  21.         if (tmpi>=0&&tmpi<n&&tmpj>=0&&tmpj<m){
  22.             if (!visp[tmpi][tmpj][nw+1]&&(inp[tmpi][tmpj]==pr[nw+1])){
  23.                 dfsp(tmpi,tmpj,nw+1);
  24.             }
  25.         }
  26.     }
  27. }
  28.  
  29. void dfss(int _i,int _j,int nw){
  30.     viss[_i][_j][nw]=true;
  31.     if (nw==0) return;
  32.     for (int i=0;i<4;i++){
  33.         int tmpi=_i+di[i],tmpj=_j+dj[i];
  34.         if (tmpi>=0&&tmpi<n&&tmpj>=0&&tmpj<m){
  35.             if (!viss[tmpi][tmpj][nw-1]&&(inp[tmpi][tmpj]==su[nw-1])){
  36.                 dfss(tmpi,tmpj,nw-1);
  37.             }
  38.         }
  39.     }
  40. }
  41.  
  42. int main(){
  43.     string inpsoal;
  44.     cin>>inpsoal;
  45.     scanf("%d%d",&n,&m);
  46.    
  47.     for (int i=0;i<n;i++) scanf("%s",inp[i]);
  48.     cin>>pr; cin>>su;
  49.    
  50.     for (int i=0;i<pr.length();i++){
  51.         if (pr.length()-i>su.length()) continue;
  52.         bool ok=true;
  53.         for (int j=i,k=0;j<pr.length();j++,k++){
  54.             if (pr[j]!=su[k]){
  55.                 ok=false;
  56.                 j=pr.length();
  57.             }
  58.         }
  59.         yes[i]=ok;
  60.     }
  61.     for (int i=0;i<n;i++){
  62.         for (int j=0;j<m;j++){
  63.             if (pr[0]==inp[i][j]) dfsp(i,j,0);
  64.             if (su[(su.size()-1)]==inp[i][j]) dfss(i,j,(su.size()-1));
  65.         }
  66.     }
  67.     int mini=1e9;
  68.     for (int i=0;i<n;i++){
  69.         for (int j=0;j<m;j++){
  70.             if (su[0]!=inp[i][j]) continue;
  71.             for (int k=0;k<pr.size();k++){
  72.                 if (visp[i][j][k]&&yes[k]&&viss[i][j][0]) mini=min(mini,k+(int)su.length());
  73.             }
  74.         }
  75.     }
  76.     if (mini!=1e9){
  77.         printf("%d\n",mini);
  78.         return 0;
  79.     }
  80.     queue<pii>q;
  81.     memset(ans,-1,sizeof(ans));
  82.     for (int i=0;i<n;i++){
  83.         for (int j=0;j<m;j++){
  84.             if ((inp[i][j]==pr[(pr.length()-1)])&&visp[i][j][pr.length()-1]){
  85.                 q.push(mp(i,j));
  86.                 ans[i][j]=0;
  87.             }
  88.         }
  89.     }
  90.     int tmpi,tmpj;
  91.     while(!q.empty()){
  92.         tmpi=q.front().f;
  93.         tmpj=q.front().s;
  94.         q.pop();
  95.         if (inp[tmpi][tmpj]==su[0]&&viss[tmpi][tmpj][0]){
  96.             printf("%d\n",pr.length()+su.length()+ans[tmpi][tmpj]-1);
  97.             return 0;
  98.         }
  99.         for (int i=0;i<4;i++){
  100.             int xtmp=tmpi+di[i],ytmp=tmpj+dj[i];
  101.             if(xtmp>=0&&xtmp<n&&ytmp>=0&&ytmp<m){
  102.                 if (ans[xtmp][ytmp]==-1){
  103.                     ans[xtmp][ytmp]=ans[tmpi][tmpj]+1;
  104.                     q.push(mp(xtmp,ytmp));
  105.                 }
  106.             }
  107.         }
  108.     }
  109.     puts("-1");
  110.     return 0;
  111. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top