回復 1# may - //#include <iostream>
- //#include <vector>
- #include <bits/stdc++.h>
- using namespace std;
- // 檢查字串 s 是否可以均分為兩個相同的部分
- bool isPerfectPatch(const string& s) {
- int len = s.length();
- if (len % 2 != 0) return false; // 長度必須是偶數
- int mid = len / 2;
- return s.substr(0, mid) == s.substr(mid, mid); // 檢查前後段是否相等
- }
- int main() {
- int m;
- cin >> m;
-
- vector<string> fabrics(m);
- for (int i = 0; i < m; ++i) {
- cin >> fabrics[i];
- }
-
- int count = 0;
-
- // 枚舉所有 (i, j) 配對,i < j 避免重複
- for (int i = 0; i < m; ++i) {
- for (int j = i + 1; j < m; ++j) {
- string AB = fabrics[i] + fabrics[j];
- string BA = fabrics[j] + fabrics[i];
-
- // 若 AB 或 BA 其中之一是完美拼布
- if (isPerfectPatch(AB) || isPerfectPatch(BA)) {
- count++;
- }
- }
- }
-
- cout << count << endl;
- return 0;
- }
複製代碼 ---------------------------------------------
程式解釋
讀取輸入
先讀取 m(布料數量)。
接著讀取 m 個字串,存入 vector<string> fabrics。
檢查所有可能的組合
使用雙重迴圈遍歷所有 (i, j) 的字串組合。
檢查 AB = fabrics + fabrics[j] 和 BA = fabrics[j] + fabrics 是否為「完美拼布」。
判斷「完美拼布」條件
若 AB 或 BA 其一符合 isPerfectPatch(),則計數增加。
isPerfectPatch() 判斷:
字串長度是否為偶數。
前半段與後半段是否相等。
輸出結果
最終輸出符合條件的布料對數。
時間複雜度分析
雙層迴圈組合檢查:O(m^2)
isPerfectPatch() 需執行 O(N)(N 為最大字串長度)。
總體時間複雜度為 O(m^2 * N),在 m=5000, N=1000 時仍可接受。
--------------------------------------------
測資
測試資料 00(最小邊界)
說明:最小輸入 m=1,不可能形成「完美拼布」。
輸入
1
abc
輸出
0
測試資料 01(基本案例)
說明:"a" 和 "aaa" 形成 "aaaa",可以拆成 "aa" + "aa",滿足條件。
輸入
3
a
aaa
b
輸出
1
測試資料02(多組合可匹配)
說明:"abcabc" 與 "abc" 可以形成 "abcabcabc",但不符合條件。"abab" 與 "abab" 可形成 "abababab",可以拆成 "abab" + "abab",符合條件。
輸入
4
abcabc
abab
abc
abab
輸出
1
測試資料 03(全部可匹配)
說明:所有字串都可以兩兩匹配形成「完美拼布」。
輸入
3
xyxy
xy
xyxyxyxy
輸出
3
測試資料 04(長字串測試)
說明:測試長度較大的字串,確保程式正確性。
輸入
3
abcabcabcabc
abcabc
abcabcabcabc
輸出
1
這些測資涵蓋:
最小邊界
單一可匹配組合
部分可匹配組合
全部可匹配組合
長字串測試 |