马拉车算法

马拉车算法

struct Manacher {
	int n, huiwen_mx;
	string s, str;
	vector<int> d;
	Manacher(string &str_) {
		str = str_;
        n = str.size();
        get_d();
        get();
	}
	
	inline void init() {
		s.push_back('$');
		s.push_back('#');
		for (int i = 0; i < n; i++) {
			s.push_back(str[i]);
			s.push_back('#');
		}
		d.assign((int)s.size(), 0);
		n = s.size() - 1;
	}
	
	inline void get_d() {
		init();
		d[1] = 1;
		for (int l, r = 1, i = 2; i <= n; i++) {
			if (i <= r) d[i] = min(d[r - i + l], r - i + 1);
			while (s[i - d[i]] == s[i + d[i]]) d[i]++;
			if (i + d[i] - 1 > r) l = i - d[i] + 1, r = i + d[i] - 1;
		}
	}
	
	inline void get() {
		for (int i = 1; i <= n; i++) {
			if (s[i] == '#') {
                huiwen_mx = max(huiwen_mx, d[i] - d[i] % 2);
            } else {
                huiwen_mx = max(huiwen_mx, d[i] - (d[i] % 2 == 0));
            }
		}
	}
};

void solve() {
	string s;
	cin >> s;
	int n = s.size();
	Manacher t(s);
	cout << t.huiwen_mx << '\n';
}
posted @ 2024-09-10 10:49  grape_king  阅读(13)  评论(0)    收藏  举报