//http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 一个奇妙的o(n)算法,明天看看~~
看完结果总结如下:
原串: w aa bwsw f d
新串: # w # a # a # b # w # s # w # f # d #(转载)
辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1
这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX 230000
char
long p[MAX];
long max(long a,long b){
}
long min(long a,long b){
}
void Change(){
}
void slove(){
}
int main()
{
}
很开心很久没有自己a出题目来了,暑假第一道题,(*^__^*) 嘻嘻…… hdu3068
#include <iostream>
#include <string.h>
#include <stdio.h>
#define MAX 110009
using namespace std;
int main()
{
}
另一个版本:
Problem : 3068 ( 最长回文 ) Judge Status : Accepted
RunId : 6255711 Language : C++ Author : ssun
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include "stdio.h"
#include "string.h"
#define N 2200050
char str[N],nstr[2*N];
int rad[2*N];
int len,nlen;
int manacher(){
int id, i, ans = 1;
int mx = 0;
// printf("%d",strlen(nstr));
for(i=1; i<nlen; i++){//$#1#2#3#3#2#1#不要用strlen(nstr)代替nlen
if(mx > i)
rad[i] = mx - i < rad[2*id-i] ? mx - i : rad[2*id-i];
else
rad[i] = 1;
for(;nstr[i+rad[i]] == nstr[i-rad[i]];rad[i]++)
;
if(rad[i] + i > mx){
mx = rad[i] + i;
id = i;
}
ans = rad[i] > ans ? rad[i] : ans;
}
return ans-1;
}
int main(){
while(scanf("%s",str)!=EOF){
int i=0;
// memset(rad,0,sizeof(rad));
nstr[0] = '$';
nstr[1] = '#';
len = strlen(str);
for(i=0; i<len; i++){
nstr[2*i+3] = '#';
nstr[2*i+2] = str[i];
}
nstr[2*i+2] = 0;
nlen = 2 * len + 2;
printf("%d\n",manacher());
}
return 0;
}