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   itdef  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2020-12-23 LeetCode 150. 逆波兰表达式求值 栈
2020-12-23 LeetCode 387. 字符串中的第一个唯一字符 哈希

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示