けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 360 B - Vertical Reading (5Q, 灰色, 200 点)

問題文の理解が大変かもしれない。

問題概要

英小文字からなる文字列  S, T が与えられる。次の条件を満たす 2 角整数  c, w ( 1 \le c \le w \lt |S|) が存在しるかどうかを判定せよ。

「文字列  S w 文字ごとに分割したとき、各分割された文字列の  c 文字目を連結して得られる文字列が  T に一致する」

制約

  •  1 \le |T| \le |S| \le 100

考えたこと

問題文がややこしいが、次のように解釈できる。


0-indexed で考える。

整数  0 \le c \lt w \le |S| であって、文字列  S の添字 (0 始まり) が  w で割って  c 余る部分の文字を連結したときに、 T になるものが存在するかを判定せよ。


全体を通して、次のように探索すればよい。

bool res = false;
for (int w = 1; w <= S.size(); ++w) {
    for (int c = 0; c < w; ++c) {
        string U = (S のうち、添字が w で割って c 余る文字を連結したもの);
        if (U == T) res = true;
    }
}

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    string S, T;
    cin >> S >> T;
    
    bool res = false;
    for (int w = 1; w < S.size(); ++w) {
        for (int c = 0; c < w; ++c) {
            string U = "";
            for (int k = c; k < S.size(); k += w) {
                U += S[k];
            }
            if (U == T) res = true;
        }
    }
    cout << (res ? "Yes" : "No") << endl;
}