結果

問題 No.1909 Detect from Substrings
ユーザー asaringo
提出日時 2022-05-29 17:47:21
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,853 bytes
コンパイル時間 1,706 ms
コンパイル使用メモリ 198,500 KB
最終ジャッジ日時 2025-01-29 16:58:18
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 15 WA * 21
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
typedef long double ld ;
typedef pair<ll,ll> P ;
typedef tuple<bool,ll,ll,ll> TP ;
#define chmin(a,b) a = min(a,b)
#define chmax(a,b) a = max(a,b)
#define bit_count(x) __builtin_popcountll(x)
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a / gcd(a,b) * b
#define rep(i,n) for(int i = 0 ; i < n ; i++)
#define rrep(i,a,b) for(int i = a ; i < b ; i++)
#define endl "\n"
#define a_z "abcdefghijklmnopqrstuvwxyz"

int n , m ;
string S[505050] ;
vector<string> vec ;

int main(){
    cin >> n >> m ;
    rep(i,n) cin >> S[i] ;
    string s = S[0] ;
    string t = S[1] ;
    string a = "" , b = "" ;
    int i = 0 , j = 0 ;
    bool use_a = false , use_b = false ;
    while(true){
        if(i == m && j == m) break;
        if(i == m){
            a += t[j] ;
            b += t[j] ;
            j++ ;
        }
        else if(j == m){
            a += s[i] ;
            b += s[i] ;
            i++ ;
        }
        else if(s[i] != t[j]){
            if(s[i+1] == t[j+1] && !use_a && !use_b){
                a += s[i] ;
                a += t[j] ;
                b += t[j] ;
                b += s[i] ;
                use_a = true ;
                use_b = true ;
                i++ ;
                j++ ;
            }
            else if(s[i+1] == t[i] && t[i+1] == s[i] && !use_a && !use_b){
                a += s[i] ;
                a += t[j] ;
                a += t[j+1] ;
                b += t[j] ;
                b += s[i] ;
                b += s[i+1] ;
                use_a = true ;
                use_b = true ;
                i+=2 ;
                j+=2 ;
            }
            else if(s[i+1] == t[i] && !use_a) a += s[i] , b += s[i] , i++ , use_a = true ;
            else if(t[j+1] == s[j] && !use_b) b += t[j] , a += t[j] , j++ , use_b = true ;
            else{
                cout << 0 << endl ;
                return 0 ;
            }
        }
        else{
            a += s[i] ;
            b += t[j] ;
            i++ ;
            j++ ;
        }
    }
    bool ok = a == b ? true : false ;
    bool ga = true , gb = true ;
    int res = 2 ;
    rep(i,n){
        int ida = 0 ;
        if(ga) rep(j,m){
            if(!ga) break;
            while(a[ida] != S[i][j]){
                ida++ ;
                if(ida == 2){
                    ga = false ;
                    break ;
                }
            }
            ida++ ;
        }
        int idb = 0 ;
        if(gb) rep(j,m){
            if(!gb) break;
            while(a[idb] != S[i][j]){
                idb++ ;
                if(idb == 2){
                    gb = false ;
                    break ;
                }
            }
            idb++ ;
        }
    }
    if(!ga) res-- ;
    if(!gb) res-- ;
    if(res == 2 && ok) res = 1 ;
    cout << res << endl ;
}
0