給定長度 n (≤1000) 的字符串 s,僅含前 p (≤26) 個小寫字母。s 滿足:無長度 ≥2 的回文子串。求字典序最小的、比 s 大、同樣合法的字符串,不存在輸出 NO。
bool check(int pos, char c, const string& s) {
if (pos >= 1 && s[pos-1] == c) return false;
if (pos >= 2 && s[pos-2] == c) return false;
return true;
}
int main() {
int n, p; string s;
cin >> n >> p >> s;
for (int i = n-1; i >= 0; --i) {
for (char c = s[i]+1; c < 'a'+p; ++c) {
if (!check(i, c, s)) continue;
s[i] = c;
// 後綴貪心填最小
for (int j = i+1; j < n; ++j) {
for (char c2 = 'a'; c2 < 'a'+p; ++c2) {
if (check(j, c2, s)) { s[j] = c2; break; }
}
}
cout << s << endl;
return 0;
}
}
cout << "NO" << endl;
return 0;
}
O(n × p²) ≤ 1000 × 26² ≈ 6.7e5,極快。
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 3 3 / cba | NO | p=3 僅有 a,b,c,cba 已是最大合法串 |
| 3 4 / cba | cbd | 末位 a→d 合法 |
| 4 4 / abcd | abda | 第三位 c→d,末位填 a |