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

    题目描述

    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度
    输入输出格式
    输入格式:
    一行小写英文字符a,b,c...y,z组成的字符串S
    输出格式:
    一个整数表示答案

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=55000000+100;
    char s[maxn];
    char str[maxn<<1];
    int p[maxn<<1];
    int n;
    void init()
    {
    	str[0]=str[1]='#';
    	for(int i=0;i<n;i++)
    	str[i*2+2]=s[i],str[i*2+3]='#';
    	n=n*2+2;
    	str[n]='$';
    }//处理中点非字符情况比如长度为2*n的串,同时让计数p[i]是+1,非+2
    int manacher()
    {
    	int r=0,mid=0,ans=0;
        for(int i=1;i<n;i++)
        {
        	if(i<r)p[i]=min(p[(mid<<1)-i],r-i);
        	//用左边更新过的区间子串更新右边,r为右边界,r-i为不超边界最大长度,所以取min
        	else p[i]=1;
        	while(str[i-p[i]]==str[i+p[i]])p[i]++;
        	if(i+p[i]>r)//如果已拓展边界超过原边界,更新边界及中间点
        	{
        		r=p[i]+i;
        		mid=i;
    		}
    		if(p[i]>ans-1)
    		ans=p[i];
    	}
    	return ans-1;
    }
    int main()
    {
    	scanf("%s",s);
    	n=strlen(s);
    	init();
    	printf("%d
    ",manacher());
    	return 0;
    }
    
  • 相关阅读:
    浅谈js的继承
    Android调用jni全过程,方便以后操作
    oracle中查找执行效率低下的SQL
    EBS R12 怎么修改APPS密码
    oracle查看系统资源占用情况
    ramfs
    091104 晴
    周六
    注意调整
    短信收到
  • 原文地址:https://www.cnblogs.com/DriverBen/p/10535968.html
Copyright © 2011-2022 走看看