列表

详情


NC23501. 小A的回文串

描述

小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的。所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意。现在小A可以对这个字符串做一些改动,他可以把这个字符串最前面的某一段连续的字符(不改变顺序)移动到原先字符串的末尾。那么请问小A通过这样的操作之后(也可以选择不移动)能够得到最大回文子串的长度是多少。

输入描述

输出描述

一行输出一个整数,表示通过这样的操作后可以得到最大回文子串的长度。

示例1

输入:

dcbaabc

输出:

7

说明:

将前面的dcba移动到末尾变成abcdcba,这个字符串的最大回文子串就是它本身,长度为7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 364K, 提交时间: 2019-04-12 19:52:48

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn=1e5;

char a[maxn];

int main() {
	string s;
	cin >>s;
	s+=s;
	int len=s.length();
	int l=0;
	a[l++]='#';
	for(int i=0;i<len;i++) {
		a[l++]=s[i];
		a[l++]='#';
	}
	int i,ans=1;
	for(i=1;i<strlen(a);i++) {
		int l=1;
		while(a[i-l]==a[i+l]&&l<=len/2)l++;
		ans=max(ans,l-1);
	}
	cout << ans <<endl;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 188ms, 内存消耗: 98284K, 提交时间: 2020-02-27 11:51:28

#include<bits/stdc++.h>
using namespace std;
bool palin[10001][10001];
int main()
{
	string s;
	cin>>s;
	s+=s;
	int n=s.length();
	int ans=0;
	memset(palin,0,sizeof palin);
	for(int i=1;i<n;i++)
	{
		for(int j=i;j>=0&&i-j+1<=n/2;j--)
		{
			if(s[i]==s[j]&&((i-j<2)||palin[j+1][i-1]))
			{
				palin[j][i]=1;
				ans=max(ans,i-j+1);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

上一题