以第一條序列為基準,枚舉所有子串(長度 3..60),按長度降序、字典序升序檢查是否在其餘所有序列中出現(`strstr` / `string::find`)。
找到第一個即為答案。
複雜度:`O(L² * m * L)` = `60² * 10 * 60 ≈ 2e6`,極快。
對每個候選子串構建 KMP `next` 數組,在其餘序列中 KMP 匹配,同樣可行。
#include
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while (T--) {
int m; cin >> m;
vector dna(m);
for (int i = 0; i < m; ++i) cin >> dna[i];
string ans = "";
int L = dna[0].size();
for (int len = L; len >= 3; --len) {
string best = "";
for (int i = 0; i + len <= L; ++i) {
string sub = dna[0].substr(i, len);
bool ok = true;
for (int j = 1; j < m; ++j)
if (dna[j].find(sub) == string::npos) { ok = false; break; }
if (ok) {
if (best.empty() || sub < best) best = sub;
}
}
if (!best.empty()) { ans = best; break; }
}
if (ans.empty()) cout << "no significant commonalities\n";
else cout << ans << "\n";
}
return 0;
}