Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define f first
- #define s second
- #define mp make_pair
- #define ll long long
- #define pii pair <int,int>
- #define pb push_back
- using namespace std;
- int n,m; string pr,su;
- int di[]={1,-1,0,0};
- int dj[]={0,0,-1,1};
- char inp[205][205];
- bool yes[205],viss[205][205][205],visp[205][205][205];
- int ans[205][205];
- void dfsp(int _i,int _j,int nw){
- visp[_i][_j][nw]=true;
- if (nw==(pr.length()-1)) return;
- for (int i=0;i<4;i++){
- int tmpi=_i+di[i],tmpj=_j+dj[i];
- if (tmpi>=0&&tmpi<n&&tmpj>=0&&tmpj<m){
- if (!visp[tmpi][tmpj][nw+1]&&(inp[tmpi][tmpj]==pr[nw+1])){
- dfsp(tmpi,tmpj,nw+1);
- }
- }
- }
- }
- void dfss(int _i,int _j,int nw){
- viss[_i][_j][nw]=true;
- if (nw==0) return;
- for (int i=0;i<4;i++){
- int tmpi=_i+di[i],tmpj=_j+dj[i];
- if (tmpi>=0&&tmpi<n&&tmpj>=0&&tmpj<m){
- if (!viss[tmpi][tmpj][nw-1]&&(inp[tmpi][tmpj]==su[nw-1])){
- dfss(tmpi,tmpj,nw-1);
- }
- }
- }
- }
- int main(){
- string inpsoal;
- cin>>inpsoal;
- scanf("%d%d",&n,&m);
- for (int i=0;i<n;i++) scanf("%s",inp[i]);
- cin>>pr; cin>>su;
- for (int i=0;i<pr.length();i++){
- if (pr.length()-i>su.length()) continue;
- bool ok=true;
- for (int j=i,k=0;j<pr.length();j++,k++){
- if (pr[j]!=su[k]){
- ok=false;
- j=pr.length();
- }
- }
- yes[i]=ok;
- }
- for (int i=0;i<n;i++){
- for (int j=0;j<m;j++){
- if (pr[0]==inp[i][j]) dfsp(i,j,0);
- if (su[(su.size()-1)]==inp[i][j]) dfss(i,j,(su.size()-1));
- }
- }
- int mini=1e9;
- for (int i=0;i<n;i++){
- for (int j=0;j<m;j++){
- if (su[0]!=inp[i][j]) continue;
- for (int k=0;k<pr.size();k++){
- if (visp[i][j][k]&&yes[k]&&viss[i][j][0]) mini=min(mini,k+(int)su.length());
- }
- }
- }
- if (mini!=1e9){
- printf("%d\n",mini);
- return 0;
- }
- queue<pii>q;
- memset(ans,-1,sizeof(ans));
- for (int i=0;i<n;i++){
- for (int j=0;j<m;j++){
- if ((inp[i][j]==pr[(pr.length()-1)])&&visp[i][j][pr.length()-1]){
- q.push(mp(i,j));
- ans[i][j]=0;
- }
- }
- }
- int tmpi,tmpj;
- while(!q.empty()){
- tmpi=q.front().f;
- tmpj=q.front().s;
- q.pop();
- if (inp[tmpi][tmpj]==su[0]&&viss[tmpi][tmpj][0]){
- printf("%d\n",pr.length()+su.length()+ans[tmpi][tmpj]-1);
- return 0;
- }
- for (int i=0;i<4;i++){
- int xtmp=tmpi+di[i],ytmp=tmpj+dj[i];
- if(xtmp>=0&&xtmp<n&&ytmp>=0&&ytmp<m){
- if (ans[xtmp][ytmp]==-1){
- ans[xtmp][ytmp]=ans[tmpi][tmpj]+1;
- q.push(mp(xtmp,ytmp));
- }
- }
- }
- }
- puts("-1");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement