303 [UVA 12467] Secret word

// 303 [UVA 12467] Secret word.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/910

给你一个字符串 s,你需要找出 s 中最长的 secret word,
一个字符串 p 是 secret word 需要满足:

p 是 s的子串(p 可以与 s 相等);将 p 翻转后是 s 的前缀。
输入一行字符串 s,输出一行字符串为你求得的 p。

输入格式
一行一个字符串 s。

输出格式
输出一行一个字符串表示答案。

样例输入
listentothesilence
样例输出
sil
数据规模
对于所有数据,保证 1≤|s|≤105
,字符串均由小写字母构成。
*/


#include <iostream>
#include <cstring>

using namespace std;

const int N = 2 * 100010;
char s[N];
int ne[N];

int main()
{
	cin >>s + 1;
	int n = strlen(s + 1);
	s[n + 1] = '#';
	for (int i = 0; i < n; i++) {
		s[n + 2+i] = s[i + 1];
	}
	
	int l = n + 2; int r = n + 1 + n;
	while (l < r) {
		swap(s[l], s[r]);
		l++; r--;
	}
	n = strlen(s + 1);
	for (int i = 2, j = 0; i <= n; i++) {
		while (j && s[i] != s[j + 1]) j = ne[j];
		if (s[i] == s[j + 1]) j++;
		ne[i] = j;
	}
	
	int idx = -1; int len = 0;
	for (int i = n / 2; i <= n; i++) {
		if (ne[i] > len) {
			len = ne[i]; idx = i;
		}
	}

	for (int i = 0; i < len; i++) {
		cout << s[idx - i];
	}
	cout << endl;


	return 0;
}


posted on 2024-12-23 11:57  itdef  阅读(12)  评论(0)    收藏  举报

导航