求调
查看原帖
求调
1318655
ALingyyds楼主2024/11/5 23:43
#include<iostream>
using namespace std;
int main() {
	int n = 0;
	int* d = new int[2 * n + 5];
	char* s = new char[n * 2 + 5];
	cin >> n;
	//原串的最长回文串=新串最长回文半径-1
	int i, j = 1;
	for (i = 1; i <= n; i++) {
		d[j] = 0;
		s[j++] = '#';
		d[j] = 0;
		cin >> s[j];
		j++;
	}
	s[0] = '*';
	s[j] = '#';
	d[1] = 1;
	int l = 1, r = 1;
	int mx = 1;
	for (i = 2; i <= 2 * n + 1; i++) {//i的对称点r-i=x-l
		if (i <= r) {
			if (d[r + l - i] < r - i + 1)
				d[i] = d[r + l - i];
			else {
				d[i] = r - i + 1;
				while (s[i - d[i]] == s[i + d[i]] && i + d[i] <= 2 * n + 1 && i - d[i] >= 1)d[i]++;
			}
		}
		else {
			while (s[i - d[i]] == s[i + d[i]] && i + d[i] <= 2 * n + 1 && i - d[i] >= 1)d[i]++;
		}
		if (r < i + d[i] - 1) {
			r = i + d[i] - 1;
			l = i - d[i] + 1;
		}
		if (d[i] > mx && r == 2 * n + 1)
			mx = d[i];
		cout<<d[i]<<" ";
	}
	mx--;
	cout << n - mx;
	cout << "ok";
	delete[] d;
	delete[] s;
	return 0;
}
2024/11/5 23:43
加载中...