zoukankan      html  css  js  c++  java
  • hdu 3068

    最长回文

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 9081    Accepted Submission(s): 3131


    Problem Description
    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
    回文就是正反读都是一样的字符串,如aba, abba等
     
    Input
    输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
    两组case之间由空行隔开(该空行不用处理)
    字符串长度len <= 110000
     
    Output
    每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
     
    Sample Input
    aaaa abab
     
    Sample Output
    4 3
     
    Source
     

    http://blog.sina.com.cn/s/blog_6fa65cf90100s3sg.html

    manacher算法

    #include"iostream"
    #include"cstdio"
    #include"cstring"
    using namespace std;
    const int N=110055;
    
    int p[2*N];
    char str0[N],str[2*N];
    
    void init()
    {
    	int i,l;
    	str[0]='@';str[1]='#';
    	for(i=0,l=2;str0[i];i++,l+=2)
    	{
    		str[l]=str0[i];
    		str[l+1]='#';
    	}
    	str[l]=0;
    }
    int solve()
    {
    	int ans=0;
    	int i,mx,id;
    	mx=0;
    	for(i=1;str[i];i++)
    	{
    		if(mx>i)p[i]=p[2*id-i]>(mx-i)?(mx-i):p[2*id-i];
    		else	p[i]=1;
    		while(str[i+p[i]]==str[i-p[i]])	p[i]++;
    		if(i+p[i]>mx)
    		{
    			mx=i+p[i];
    			id=i;
    		}
    		if(p[i]>ans)	ans=p[i];
    	}
    	return ans-1;
    }
    int main()
    {
    	while(scanf("%s",str0)!=-1)
    	{
    		init();
    		printf("%d
    ",solve());
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    easyui好例子,值得借鉴
    DDL 和DML 区别
    兼容IE的文字提示
    搭代理
    美国服务器
    跟随滚动条滚动
    JS Array对象
    JS 内置对象 String对象
    JS 对象
    JS 二维数组
  • 原文地址:https://www.cnblogs.com/a972290869/p/4251041.html
Copyright © 2011-2022 走看看