题记:写这篇博客要主是加深自己对最大算法的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。
来源:点击打开链接
直接做会超时,须要优化,网上通行的算法是manacher算法(详细原理还不是很明确),这里可以当模板使。
// 原串最大长度N // 返回最大回文字串 res #include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<algorithm> using namespace std; const int N = 110009; int rid[N<<2]; string manacher(char *s){ string t, res; int L = strlen(s); // init t += '?'; for(int i = 0; i < L; i++) t += '#', t += s[i]; t += "#*"; // getrid for(int i=1,j=0,k,End=(int)t.size();i<End;){ while( t[i-j-1]==t[i+j+1] ) j++; rid[i] = j; for(k=1;k<=j&&(rid[i-k]!=rid[i]-k);k++) rid[i+k] = min( rid[i-k], rid[i]-k ); i += k; j = max( 0,j-k ); } // Max int m = 0, pos; for(int i = 1; i < (int)t.size(); i++){ if( m < rid[i]*2+(t[i]!='#') ) m = rid[i]*2+(t[i]!='#'), pos = i; } for(int i = pos-rid[pos]; i <= pos+rid[pos]; i++){ if( t[i] != '#' ) res += t[i]; } return res; } int main() { char s[N]; while(scanf("%s", s)!=EOF) { string ans = manacher(s); // printf("MaxLength = %d\n", ans.size() ); printf("%d\n", ans.size() ); } return 0; }
文章结束给大家分享下程序员的一些笑话语录: 腾讯的动作好快,2010年3月5日19时28分58秒,QQ同时在线人数1亿!刚刚看到编辑发布的文章,相差才2分钟,然后连专题页面都做出来了,他们早就预料到了吧?(其实,每人赠送10Q币,轻轻松松上两亿!)