题目链接
翻译
让你选择字符串 (s) 的一个前缀和一个后缀(可以为空), 然后拼成一个字符串。
要求这个字符串得是一个回文串,且这个字符串的长度不能超过原串 (s) 的前提下最长。
输出这个字符串, easy 版本,长度小于等于 (5000)
题解
考虑最后的答案 (t),是由 (s) 的一个前缀 (pres) 和一个后缀 (afters) 构成。
又因为 (t) 是一个回文串,所以头尾两个蓝色 t'
部分是相同的。
因此,一上来我们可以先用 while (s[l]==s[r])l++,r--
去掉头尾相同的部分(看代码)
然后我们真正要枚举的就是中间的 (s') 部分了,这一部分要么是开头的前缀扩展出来的,要么是后缀往前扩展出来的。
并且 (s') 也要是一个回文串。
有了这个思路,我们就判断一下是前缀还是后缀扩展出来的 (s') 长,加上去就好。
代码
import java.io.*;
import java.util.*;
public class Main {
static InputReader in;
static PrintWriter out;
public static void main(String[] args) throws IOException{
//InputStream ins = new FileInputStream("E:\rush.txt");
InputStream ins = System.in;
in = new InputReader(ins);
out = new PrintWriter(System.out);
//code start from here
new Task().solve(in, out);
out.close();
}
static int N = 50000;
static class Task{
int t,end1,begin2;
String s;
public boolean ok(int l,int r) {
if (l > r){
return false;
}
while (l <= r){
if (s.charAt(l)==s.charAt(r)){
l++;r--;
}else{
return false;
}
}
return true;
}
public void solve(InputReader in,PrintWriter out) {
t = in.nextInt();
while( (t--) > 0 ){
s = in.next();
int l = 0,r = s.length()-1;
while (l<=r && s.charAt(l)==s.charAt(r)){
l++;r--;
}
if (l > r){
out.println(s);
continue;
}
int mostRihgt = l-1,mostLeft = r+1;
for (int i = l;i<=r;i++){
if (ok(l,i)){
mostRihgt = i;
}
}
for (int i = r;i >= l;i--){
if (ok(i,r)){
mostLeft = i;
}
}
if (l-1>=0) {
out.print(s.substring(0,l));
}
if (mostRihgt-l > r-mostLeft && mostRihgt-l>=0){
out.print(s.substring(l,mostRihgt+1));
}else{
if (r>=mostLeft){
out.print(s.substring(mostLeft,r+1));
}
}
if (r+1<s.length()){
out.print(s.substring(r+1,s.length()));
}
out.println("");
}
}
}
static class InputReader{
public BufferedReader br;
public StringTokenizer tokenizer;
public InputReader(InputStream ins) {
br = new BufferedReader(new InputStreamReader(ins));
tokenizer = null;
}
public String next(){
while (tokenizer==null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(br.readLine());
}catch(IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
}