zoukankan      html  css  js  c++  java
  • [poj] 3974 Palindrome

    原题

    manacher板子题

    manacher算法:
    用于处理一个字符串的回文子串长度的算法,时间复杂度O(n)。
    首先为了避免奇偶的问题,我们将原字符串转化一下,在每个字符见加一个'#',然后首尾加一个不一样的字符如'@'和'?'。
    然后我们维护两个变量mxr和p,分别为到当前位置所匹配到的最右节点和匹配了这个节点的中心位置。而对于将要匹配的位置i,我们有三种可能:
    1、mxr<i,那么i的ans>=1(也就是需要暴力匹配)
    2、mxr-i>a[j],那么i的ans应该等于关于p与其对称的j的ans。
    3、mxr-i<=a[j],那么i的ans>=mxr-i。

    所以上代码咯~

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 1000010
    using namespace std;
    int l,cnt,mxr,p,a[2*N],mx;
    char s[2*N];
    
    int main()
    {
        while(1)
        {
    	scanf("%s",s+1);
    	s[0]='@';
    	l=strlen(s+1);
    	if (s[1]=='E' && s[2]=='N' && s[3]=='D') break;
    	cnt++;
    	for (int i=l;i>=1;i--) s[i*2]=s[i];
    	for (int i=1;i<=2*l+1;i+=2) s[i]='#';
    	s[2*l+2]='?';
    	l=2*l+1;
    	mx=mxr=0;
    	for (int i=1,x;i<=l;i++)
    	{
    	    if (mxr>i) x=min(a[2*p-i],mxr-i);
    	    else x=1;
    	    while (s[i-x]==s[i+x]) x++;
    	    if (i+x>mxr) mxr=i+x,p=i;
    	    a[i]=x;
    	    mx=max(mx,a[i]);
    	}
    	printf("Case %d: %d
    ",cnt,mx-1);
        }
        return 0;
    }
    
    
  • 相关阅读:
    MySQL在windows上的安装步骤
    k-均值聚类算法
    python2和python3中filter函数
    解决mysql出现的问题#1055
    python高级编程1
    二叉树
    Python常用算法(二)
    Python常用算法(一)
    Java蓝桥杯--入门训练(1) Fibonacci数列
    java基础--for-跑步运动
  • 原文地址:https://www.cnblogs.com/mrha/p/7868786.html
Copyright © 2011-2022 走看看