UVA12467 Secret Word 题解

题目传送门

前置知识

前缀函数与 KMP 算法

解法

考虑将 \(S\) 翻转后得到 \(S'\),然后就转化为求 \(S'\) 的一个最长子串使得其是 \(S\) 的前缀。使用 KMP 求解即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
int nxt[1000002];
char s1[1000002],s2[1000002];
int main()
{
	int t,n,ans,i,j,k;
	cin>>t;
	for(k=1;k<=t;k++)
	{
		cin>>(s2+1);
		n=strlen(s2+1);
		ans=0;
		for(i=1;i<=n;i++)
		{
			s1[i]=s2[n-i+1];
		}
		for(i=2,nxt[1]=j=0;i<=n;i++)
		{
			while(j>=1&&s2[i]!=s2[j+1])
			{
				j=nxt[j];
			}
			j+=(s2[i]==s2[j+1]);
			nxt[i]=j;
		}
		for(i=1,j=0;i<=n;i++)
		{
			while(j>=1&&(j==n||s1[i]!=s2[j+1]))
			{
				j=nxt[j];
			}
			j+=(s1[i]==s2[j+1]);
			ans=max(ans,j);
			if(j==n)
			{
				j=nxt[n];
			}
		}
		for(i=ans;i>=1;i--)
		{
			cout<<s2[i];
		}
		cout<<endl;
	}
	return 0;
}
posted @ 2024-02-13 18:17  hzoi_Shadow  阅读(6)  评论(0编辑  收藏  举报
扩大
缩小