ACM 训练日志记录 · 思考 · 成长 提交 / 修改记录
王梓豪 / 题目列表训练档案
导出

最长公共前后缀长度

来源:其他 ★ 1300

本题活力0.26按难度、完成结果与训练证据估算

算法如山行则将至

题目描述

求在字符串尾添加最少字符数使其变为回文串。

代码

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    int n;
    while (cin >> n && n != 0) {
        string s;
        cin >> s;
        string r = s;
        reverse(r.begin(), r.end());
        string t = r + "#" + s;
        vector<int> nxt(t.size(), 0);
        for (int i = 1; i < (int)t.size(); ++i) {
            int j = nxt[i - 1];
            while (j > 0 && t[i] != t[j]) j = nxt[j - 1];
            if (t[i] == t[j]) ++j;
            nxt[i] = j;
        }
        int L = nxt[t.size() - 1];
        cout << n - L << endl;
    }
    return 0;
}