ZeroJudge F341: 閱讀順序(Reading)

小雪之前看過一個研究,研究內容指出:「英文字母的組合,不影響閱讀順序。」,於是小雪決定來驗證這個研究的真實性。小雪會提供翻轉前的字串以及翻轉軸,翻轉前之字串會依照翻轉軸進行左右置換並顛倒順序。

舉例而言,若小雪提供字串 foreign 並以 re 為翻轉軸,則 re 不動,re 左右兩側的「fo」與「ign」交換位置,得到「ignrefo」,接著將「fo」、「ign」各自顛倒順序,便能得到翻轉後之字串「ngireof」。

請你撰寫一個程式,給定翻轉前字串以及翻轉軸,幫助小雪找出翻轉後之字串。

範例輸入範例輸出
第一行會輸入一串文字,代表的是翻轉前字串 S,且此字串最長長度不超過 50 個字元。
第二行會輸入一串文字,代表的是翻轉軸字串 T,S 字串必定包含 T 字串若 S 字串在 T 字串中出現不只一次,以最左邊第一次出現為翻轉軸 (請參見範例 2)。
註:輸入皆為小寫英文字母
依照翻轉規則,輸出翻轉後的字串於一行。
apple
ppl
eppla
banana
na
annaab
split
t
tilps
what
wh
tawh
complex
ex
exlpmoc
overcome
overcome
overcome

解題思路

先找到翻轉軸的位置,然後將字串切成三等份,分別為翻轉軸前、翻轉軸、和翻轉軸後。將前後字串進行翻轉並將順序對調,會變成「翻轉軸後 –> 翻轉軸 –> 翻轉軸前」。

範例程式碼-ZeroJudge F341: 閱讀順序(Reading)

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    string str, mid;
    cin >> str >> mid;
    for (int i = 0; i<str.length(); i++) {
        if (str[i] == mid[0]) {
            string tmp = "";
            for (int j = i; j<i+mid.length(); j++) tmp += str[j];
            if (tmp == mid) {
                string a = "", b = "";
                for (int j = 0; j<i; j++) a += str[j];
                for (int j = i+mid.length(); j<str.length(); j++) b += str[j];
                reverse(a.begin(), a.end());
                reverse(b.begin(), b.end());
                cout << b << mid << a << "\n";
                break;
            }
        }
    }
}

//ZeroJudge F341
//Dr. SeanXD

發佈留言