跳转至

马拉车

模版
C++
string str;
cin >> str;
int maxLen = 0;
int idx = 0;
int r = 0;
int c = 0;
int len = int(str.size()) * 2 + 1;
vector<char> a(len);
vector<int> b(len);
for (int i = 0 ; i < len ; i++) {
    a[i] = i & 1 ? str[idx++] : '#';
}
for (int i = 0 ; i < len ; i++) {
    b[i] = r > i ? min(r - i, b[c * 2 - i]) : 1;
    while (i - b[i] > -1 && i + b[i] < len && a[i - b[i]] == a[i + b[i]]) {
        b[i]++;
    }
    if (i + b[i] > r) {
        r = i + b[i];
        c = i;
    }
    if (b[i] - 1 > maxLen) {
        maxLen = b[i] - 1;
        idx = i;
    }
}
cout << maxLen << " " << str.substr((idx - maxLen + 1) / 2, maxLen);
例题