zoukankan      html  css  js  c++  java
  • [洛谷P3805]【模板】manacher算法

    题目大意:给你一个字符串(长度≤11000000),叫你求这个串的最长回文子串长度。

    解题思路:Manacher算法模板题,可以在$O(n)$的时间复杂度里求出一个串的最长回文子串。

    不知道Manacher的见:http://www.cnblogs.com/Mrsrz/p/7308621.html

    C++ Code:

    #include<cstdio>
    #include<cstring>
    #define min(a,b) (((a)>(b))?(a):(b))
    const int N=23100000+10000;
    char s[N<<1],s2[N];
    int p[N<<1],n,i;
    void manacher(){
    	int mx=0,id=0;
    	for(i=1;i<=n;++i){
    		if(mx>i)p[i]=min(p[(id<<1)-i],mx-i);else p[i]=1;
    		while(s[i-p[i]]==s[i+p[i]])++p[i];
    		if(i+p[i]>mx)mx=i+p[id=i];
    	}
    }
    int main(){
    	scanf("%s",s2+1);
    	n=strlen(s2+1);
    	s[0]='%';
    	for(i=1;i<=n;++i)
    	s[(i<<1)-1]='#',s[i<<1]=s2[i];
    	s[n=n<<1|1]='#';
    	manacher();
    	int ans=0;
    	for(i=1;i<=n;++i)
    	if(p[i]>ans)ans=p[i];
    	printf("%d
    ",ans-1);
    	return 0;
    }
    
  • 相关阅读:
    网络
    分区
    JavaScript概述
    CSS样式属性
    css选择器
    CSS的引入方式
    css介绍
    HTML结构
    常用标签
    HTML介绍
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7308718.html
Copyright © 2011-2022 走看看