#include<cstdio>#include<algorithm>#include<deque>#include<cstring>#include<iostream>#pragma GCC optimize(1)usingnamespace std;constint N =10000+10;char f[60][60];int r, c;char s[N];int l;int vis[60][60];int ds[55][55][4][3];struct node
{int x, y, d;int step;};int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int ans =0x7ffffff;voidprint(int x){for(int i =0;i < x; i++)printf("%c",s[i]);printf(" ");}voidpre()//预处理{for(int i =1; i <= r; i++){for(int j =1; j <= c; j++){for(int k =0; k <4; k++){int x = i, y = j;while(f[x][y]== f[i][j]){
x += dx[k];
y += dy[k];if(x <0|| y <0){break;}if(!(x >0&& x <= r && y >0&& y <= c))break;}if(x >0&& x <= r && y >0&& y <= c){
ds[i][j][k][0]= x;
ds[i][j][k][1]= y;}}}}}voidbfs(){
deque <node> q;
q.push_back((node){1,1,0,0});while(q.size()){int x = q.front().x;int y = q.front().y;int d = q.front().d;int step = q.front().step;
q.pop_front();// cout << x <<" "<<y <<" "<<d<<" "<<step<<"\n";// print(d);// printf("%c %c\n",f[x][y],s[d]);if(s[d]== f[x][y])//在一个位置重复按{int cnt =0;int p = d;while(f[x][y]== s[p]){
cnt++;
p++;}
d += cnt;
step += cnt;
q.push_front((node){// 插入到队头
x,y,d ,step
});}if(d == l +1){printf("%d",step);return;}for(registerint i =0; i <4; i++){int xx = ds[x][y][i][0];int yy = ds[x][y][i][1];//cout<<xx<<" "<<yy<<"\n";if(xx >0&& xx <= r && yy >0&& yy <= c && vis[xx][yy]< d){
vis[xx][yy]= d;
q.push_back((node){
xx,yy,d,step +1});//插入到队尾}}}}intmain(){scanf("%d %d",&r,&c);getchar();for(registerint i =1; i <= r; i++){for(registerint j =1; j <= c; j++){
f[i][j]=getchar();}getchar();}scanf("%s",s);pre();
l =strlen(s);
s[l]='*';memset(vis,-1,sizeof(vis));bfs();return0;}