现在的位置: 首页 > 综合 > 正文

HDOJ 3068 && 最长回文子串

2018年02月20日 ⁄ 综合 ⁄ 共 1468字 ⁄ 字号 评论关闭

先上 超时 直接 用C++ 的string  居然会超时 。。。最后换成了 char 才可以。。。

#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std ;
const int maxn = 220010 ;
int p[maxn] ;
void insert(string &ins , string &outs)
{
	outs[0] = '$' ;
	string :: iterator iter = ins.begin();
	int len = 1 ;
	while( iter != ins.end())
	{
		 outs[len++] = '#' ;
		 outs[len++] = *iter ;
		 iter++ ;
	}
/*	for ( int i = 0 ; i < ins.size();++i)
	{
		 outs[len++] = '#' ;
		 outs[len++] = ins[i] ;
		 
	}
*/
	     outs[len] = '#' ;
	 
}

void manacher(string &outs)
{
	int mx = 0 , id = 0 ;
	memset(p, 0, sizeof(p));
	for( int i = 0 ; i < outs.size() ;++i)
	{
		 p[i] = mx > i ? min(p[2*id-i],mx -i) : 1;
		 while(outs[i+p[i]] == outs[i-p[i]])  p[i]++ ;
		 if( i + p[i] > mx )
		 {
		 	  mx =  i + p[i] ;
		 	  id = i ;
		 }
	}
}

int main()
{
	string s ;
   while(cin >> s) 
   {
	string res (2*s.size()+2 ,'a') ;
	insert(s,res) ;
	manacher(res);
    int length = 1 ;
    for ( int i = 0 ; i < res.size();++i)
              length = max(length,p[i]);
    printf("%d\n", length-1);
   }
	return 0 ;
	      
}

下面是为超时的 ,弄了一下午 才明白 为啥是这样的 。。。时间啊

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std ;
const int MAXN=110005;
char sin[MAXN];
char sout[2*MAXN];
int p[2*MAXN];

int insert( char ins[] , char outs[])
{
	outs[0] = '$' ;
	int len = 1 ;
	int i = 0 ;
	while(  ins[i] != '\0')
	{
		 outs[len++] = '#' ;
		 outs[len++] = ins[i] ;
		 ++i;
	}
	outs[len++]='#';
    outs[len]=0;
    return len;
}

void manacher( char outs[] , int len)
{
	int mx = 0 , id = 0 ;
	memset(p, 0, sizeof(p));
	for( int i = 0 ; i < len ;++i)
	{
		 p[i] = mx > i ? min(p[2*id-i],mx -i) : 1;
		 while(outs[i+p[i]] == outs[i-p[i]])  p[i]++ ;
		 if( i + p[i] > mx )
		 {
		 	  mx =  i + p[i] ;
		 	  id = i ;
		 }
	}
}
int main()
{
	  while(scanf("%s",sin)!=EOF)
    {
        int len = insert(sin,sout);
        manacher(sout,len);
        int maxl=1;
        for(int i=0;i<len;i++)
             maxl=max(maxl,p[i]);
        printf("%d\n",maxl-1);
    }
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.