给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
aaaa abab
4 3
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAX=110000+10;
char s[MAX*2];
int p[MAX*2];
int main(){
while(scanf("%s",s)!=EOF){
int len=strlen(s),id=0,maxlen=0;
for(int i=len;i>=0;--i)
s[i+i+2]=s[i],s[i+i+1]='#';
s[0]='*';
for(int i=2;i<2*len+1;++i){
if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i);
else p[i]=1;
while(s[i-p[i]]==s[i+p[i]]) p[i]++;
if(id+p[id]<i+p[i]) id=i;
if(maxlen<p[i]) maxlen=p[i];
}
printf("%d\n",maxlen-1);
}
}
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
string maxHui(string s)
{
int len = s.length();
if(len <= 1)
return s;
string s2 = s;
reverse(s2.begin(), s2.end());
vector<vector<int>> dp(len+1, vector<int>(len+1, 0));
int res = 0, pos = 0;
for(int i = 1; i <= len; i++)
{
for(int j = 1; j < len+1; j++)
{
if(s[i-1] == s2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
if(res <= dp[i][j])
{
res=dp[i][j];
pos = i-1;
}
}
}
return s.substr(pos-res+1, res);
}
int main()
{
string str;
while(getline(cin, str))
cout << maxHui(str) << endl;
return 0;
} import java.util.Scanner;
public class Main{
public static char[] generateArray(String str){
char[] res = new char[2 * str.length() + 1];
int index = 0;
for(int i = 0; i < res.length;i++){
res[i] = (i & 1) == 0 ? '#':str.charAt(index++);
}
return res;
}
public static int Manacher(String str){
char[] charArr = generateArray(str);
int C = -1;
int R = -1;
int max = Integer.MIN_VALUE;
int[] pArr = new int[charArr.length];
for(int i = 0 ;i < charArr.length;i++){
pArr[i] = R > i ? Math.min(R-i,pArr[2 * C - i]) : 1;
while(i + pArr[i] < pArr.length && i - pArr[i] >= 0){
if(charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else
break;
}
if(i + pArr[i] > R){
R = i + pArr[i];
C = i;
}
max = Math.max(max,pArr[i]);
}
return max - 1;
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String str = sc.next();
System.out.println(Manacher(str));
}
}
}
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String string = (String) scanner.next(); System.out.println(getLongestPalindrome(string, string.length())); } } public static int getLongestPalindrome(String A, int n) { if(A==null) return 0; char []ch=A.toCharArray(); int max=0; for(int i=0;i<n;i++){ //先用奇数长度来进行判断 int len=0; for(int j=0;(i-j)>=0&&(i+j)<n;j++){ if(ch[i-j]!=ch[i+j]) break; len=2*j+1; } if(len>max) max=len; //用偶数长度进行一次判断 for(int j=0;(i-j)>=0&&(i+j+1)<n;j++){ if(ch[i-j]!=ch[i+j+1]) break; len=2*j+2; } if(len>max) max=len; } return max; } }
大家好,请问我的代码提示内部错误,可是在电脑上可以运行是怎么回事?
public class HuiWen {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String line=sc.nextLine();
if(line==null)
return;
int i=line.length();
// int max=0;
while(i>=0){
if(isPalindrom(line.substring(0, i))){
System.out.println(i);
break;
}else
i--;
}
}
}
public static boolean isPalindrom(String str){
StringBuffer buf1=new StringBuffer(str);
StringBuffer buf2=buf1.reverse();
return buf2.toString().equals(str);
}
}
import java.util.Scanner;
/**
* https://www.nowcoder.com/questionTerminal/edb0f0cc3ffd495bb4826caef5ce9104
*/
public class Main {
public static char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * 2 + 1];
int index = 0;
for (int i = 0; i != res.length; i++) {
res[i] = (i & 1) == 0 ? '#' : charArr[index++];
}
return res;
}
public static int maxLcpsLength(String str) {
if (str == null || str.length() == 0) {
return 0;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int max = Integer.MIN_VALUE;
for (int i = 0; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1;
while (i + pArr[i] < charArr.length && i - pArr[i] > -1) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
max = Math.max(max, pArr[i]);
}
return max - 1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.next();
System.out.println(maxLcpsLength(str));
}
}
}
Manacher算法实现
超时间了,不知道怎么改
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String string = in.next();
if(string==null){
continue;
}
int max = 0;
for (int i = 0; i < string.length(); i++) {
String sub;
for (int j = i + 2; j <= string.length(); j++) {
sub = string.substring(i, j);
if (isHuiWen(sub)) {
if (max < sub.length())
max = sub.length();
}
}
}
System.out.println(max);
}
}
public static boolean isHuiWen(String string) {
boolean flag = true;
char[] cs = string.toCharArray();
int n = cs.length;
for (int i = 0; i < n / 2; i++) {
if (cs[i] != cs[n - i - 1]) {
flag = false;
}
}
return flag;
}
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110005;
char str1[maxn],str2[2*maxn+1];
int pArr[2*maxn+1];
void init(int len){
int l=len*2+1,j=0;
for(int i=0;i<l;i++){
if(i%2==0){
str2[i]='#';
}
else{
str2[i]=str1[j++];
}
}
str2[l]='\0';
}
int main(){
//freopen("in.txt","r",stdin);
int n,m,pR,index,Max;
while(scanf("%s",str1)==1){
n=strlen(str1);
pR=0,index=0,Max=0;
init(n);
m=n*2+1;
for(int i=0;i<m;i++){
pArr[i]=pR>i?min(pArr[2*index-i],pR-i):1;
while(i+pArr[i]<m&&i+pArr[i]>-1){
if(str2[pArr[i]+i]==str2[i-pArr[i]]){
pArr[i]++;
}
else{
break;
}
}
if(pArr[i]+i>pR){
pR=pArr[i]+i;
index=i;
}
Max=max(Max,pArr[i]);
}
printf("%d\n",Max-1);
}
return 0;
}
#include <iostream> #include <cstring> #include <string> #include <map> #include <queue> #include <algorithm> using namespace std; char s[211000],c[111000]; int p[211000]; void init() { int i,j; s[0]='@'; for(i=0;c[i]!=0;i++) { s[2*i+1]='#'; s[2*i+2]=c[i]; } s[2*i+1]='#'; s[2*i+2]=0; } int manacher() { int id=0,mx=0,i; for(i=1;s[i]!=0;i++) { p[i]=mx>i?min(p[2*id-i],mx-i):1; while(s[i+p[i]] == s[i-p[i]])p[i]++; if(i+p[i]>mx) { mx=i+p[i]; id=i; } } mx=0; for(i=1;s[i]!=0;i++) { if(p[i]>mx)mx=p[i]; } return mx-1; } int main() { while(~scanf("%s",c)) { init(); printf("%d\n",manacher()); } return 0; }