今日の反省会場

AtCoder Grand Contest 028 - AtCoder

早解きしないとまずいと思ったので嘘っぽいとは思いつつ投げたらWA。撤退できなくなる。BもCも救いがなかったので残り30分からAを嘘のまま改善した。茶パフォでも大きいくらい😇
あしたはがんばります。

大嘘解法

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define all(x) (x).begin(),(x).end()
using namespace std;
const int INF=1145141919,MOD=1e9+7;
const long long LINF=8931145141919364364,LMOD=998244353;
// const int dx[]={1,0,-1,0,1,1,-1,-1},dy[]={0,-1,0,1,1,-1,-1,1};

int gcd(int x,int y){
    if(x<y) swap(x,y); //常にx>=y
    //ユークリッドの互除法
    if(!(x%y)) return y;
    else return gcd(y,x%y);
}

int main(){
    long long n,m; cin>>n>>m;
    string s,t; cin>>s>>t;
    // if(max(n,m)%min(n,m)==0){
    //     cout<<-1<<endl;
    //     return 0;
    // }
    long long cnt=0;
    for(long long i=n*m/gcd(n,m);;i+=n*m/gcd(n,m),cnt++){
        if(i<0||i>LINF||cnt>1e3) break;
        // cout<<i<<endl;
        long long ss=0,tt=0;
        bool flg=1;
        while(ss<n&&tt<m){
            // cout<<ss<<" "<<tt<<endl;
            if(ss*i/n==tt*i/m){
                if(s[ss]!=t[tt]){
                    flg=0;
                    break;
                }
            }
            if(ss*i/n>tt*i/m) tt++;
            else ss++;
        }
        if(flg){
            cout<<i<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
    return 0;
}