TopCoder

Caido
主唱太拼命了

User's AC Ratio

50.0% (4/8)

Submission's AC Ratio

58.3% (14/24)

Tags

Description

在最近的字串課程裡,小普學習到了一個新的字串定義,那就是對等。對於兩個長度相同的字串 $A$ 與 $B$,若他們互相對等,則滿足以下兩種條件其中之一:
1. $A$ 與 $B$ 完全相同

2. 若 $A$ 與 $B$ 的長度都是偶數,我們將字串 $A$ 從中間切開,分成兩長度相等的字串 $A_l$, $A_r$;同時也將字串 $B$ 從中間切開,分成兩長度相等的字串 $B_l$, $B_r$。則必定滿足下列其中一種情況:

  • $A_l$ 與 $B_l$ 對等,$A_r$ 與 $B_r$ 對等。
  • $A_l$ 與 $B_r$ 對等,$A_r$ 與 $B_l$ 對等。

講師們已經準備好了 $A$ 與 $B$ 當做上課例題,但小普忙著訓練他的神經網路,所以他把作業丟給你,相信聰明如你能幫他判斷兩字串是否對等。

以下為提供的解法,請構造出一筆滿足題目條件的測資讓該程式碼 TLE。為了測試方便,具體來說,你構造出來的測資必須要讓第五行宣告的全域變數 counter 的值增加到至少 $5\times 10^ 8$ 才會被視為正確。

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

long long counter = 0;

int lcp(const string &s1, const string &s2) { // 回傳最長共同前綴的長度
    int res = 0;
    for (int i = 0; i < int(s1.size()); ++i)
        if (s1[i] == s2[i])
            ++res;
        else
            break;
    return res;
}

bool is_equal(const string& s1, const string& s2) {

    counter += lcp(s1, s2) + 1; 

    if (s1 == s2) {
        return true;
    }

    int n = s1.length();
    if (n % 2 == 0) {
        int mid = n / 2;

        string s1_left = s1.substr(0, mid);
        string s1_right = s1.substr(mid);

        string s2_left = s2.substr(0, mid);
        string s2_right = s2.substr(mid);

        counter += s1.size() + s2.size();

        if ((is_equal(s1_left, s2_left) && is_equal(s1_right, s2_right)) ||
            (is_equal(s1_left, s2_right) && is_equal(s1_right, s2_left))) {
            return true;
        }
    }

    return false;
}

int main() {
    string s1, s2;
    cin >> s1 >> s2;

    if (is_equal(s1, s2)) {
        cout << "YES" << endl;
    }
    else {
        cout << "NO" << endl;
    }

    return 0;
}

Input Format

輸入包含兩行,分別是兩個長度相同的字串 $A$ 與 $B$,他們的長度都不超過 $10^ 6$,且只包含小寫英文字母。

Output Format

若兩字串對等,輸出 YES,否則輸出 NO

Sample Input 1

aaba
abaa

Sample Output 1

YES

Sample Input 2

aabb
abab

Sample Output 2

NO

Hints

以下程式碼能產生本題合法但一定不會讓你得到 AC 的測試資料:

#include <stdio.h>
int main() {
    puts("aaba");
    puts("abaa");
}
  • lcp 函數只是用來估計第 31 行 s1 == s2 這個判斷式所花費的時間,與解答設計的邏輯沒有太大關係。

Problem Source

Subtasks

No. Testdata Range Constraints Score
1 0 無其他限制 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 1000 262144 65536 1