#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf=1e12;
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n,m; cin>>n>>m;
    string a,b; cin>>a>>b;
    a=" "+a, b=" "+b;
    vector<vector<vector<int>>> dist(n+1,vector<vector<int>>(m+1,vector<int>(27,-1)));
    queue<vector<int>> q;
    for (int i=1; i<=n; i++) if (a[i]==b[1]) q.push({0,i,1,26});
    int ans=-1;
    while(!q.empty()){
        vector<int> v=q.front(); q.pop();
        int i=v[1], j=v[2], lastChar=v[3], d=-v[0];
        //cout<<i<<' '<<j<<' '<<lastChar<<' '<<d<<'\n';
        if (lastChar!=26 and lastChar==a[i]-'a'){
            lastChar=26;
        }
        if (dist[i][j][lastChar]!=-1) continue;
        dist[i][j][lastChar] = d;
        if (j==m) {
            ans=d;
            break;
        }
        if (lastChar == 26){
            //now simulate a scroll, and second step
            if (i-1>=1 and a[i-1]==b[j+1]) {
                q.push({-(d+1),i-1,j+1,26});
            }
            if (i+1<=n and a[i+1]==b[j+1]) {
                q.push({-(d+1),i+1,j+1,26});
            }
            if (i-1>=1) {
                q.push({-(d+1),i-1,j,a[i]-'a'});
            }
            if (i+1<=n) {
                q.push({-(d+1),i+1,j,a[i]-'a'});
            }
        } else{
            if (i-1>=1) {
                q.push({-(d+1),i-1,j,lastChar});
            }
            if (i+1<=n){
                q.push({-(d+1),i+1,j,lastChar});
            }
        }
    } 
    for (int i=1; i<=n; i++){
        for (int j=1; j<=m; j++){
            //cout<<i<<' '<<j<<' '<<dist[i][j]<<'\n';
        }
    }
    cout<<ans<<'\n';
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |