在最近的字串課程裡,小普學習到了一個新的字串定義,那就是對等。對於兩個長度相同的字串 $A$ 與 $B$,若他們互相對等,則滿足以下兩種條件其中之一:
1. $A$ 與 $B$ 完全相同
2. 若 $A$ 與 $B$ 的長度都是偶數,我們將字串 $A$ 從中間切開,分成兩長度相等的字串 $A_l$, $A_r$;同時也將字串 $B$ 從中間切開,分成兩長度相等的字串 $B_l$, $B_r$。則必定滿足下列其中一種情況:
講師們已經準備好了 $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;
}
輸入包含兩行,分別是兩個長度相同的字串 $A$ 與 $B$,他們的長度都不超過 $10^ 6$,且只包含小寫英文字母。
若兩字串對等,輸出 YES
,否則輸出 NO
。
以下程式碼能產生本題合法但一定不會讓你得到 AC 的測試資料:
#include <stdio.h>
int main() {
puts("aaba");
puts("abaa");
}
lcp
函數只是用來估計第 31 行 s1 == s2
這個判斷式所花費的時間,與解答設計的邏輯沒有太大關係。No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0 | 無其他限制 | 100 |