zoukankan      html  css  js  c++  java
  • hdu 3294 Girls' research

    题意:求最长回文串

    用Manacher 可以在O(n)时间内解决

    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #define MAXN 200010
    using namespace std;
    char str1[MAXN],str[MAXN*2];
    int rad[MAXN*2],nn,n;
    void Manacher(int *rad,char *str,int n)
    {
        int i;
        int mx = 0;
        int id;
        for(i=1; i<n; i++)
        {
            if( mx > i )
    			rad[i] = rad[2*id-i]<mx-i?rad[2*id-i]:mx-i;        
            else
                rad[i] = 1;
            for(; str[i+rad[i]] == str[i-rad[i]]; rad[i]++)
                ;
            if( rad[i] + i > mx )
            {
                mx = rad[i] + i;
                id = i;
            }
        }
    }
    int main()
    {
    	char c;
    	while(scanf("%c %s",&c,str1)==2)
    	{
    		getchar();
    		int t=c-'a';
    		nn=strlen(str1);
    		for(int i=0;i<nn;i++)
    		{
    			int tt=str1[i]-'a';
    			str1[i]=(tt-t+26)%26 + 'a';
    		}
    		n=2*nn+2;
    		str[0]='$';
    		for(int i=0;i<=nn;i++)
    		{
    			str[2*i+1]='#';
    			str[2*i+2]=str1[i];
    		}
    		Manacher(rad,str,n);
    		int ans=1,st;
    		for(int i=0;i<n;i++)
    		{
    			if(rad[i]>ans)
    			{
    				ans=rad[i];
    				st=i;
    			}
    		}
    		ans--;
    		st=st/2 + ans/2-1;
    		if(ans==1)
    			puts("No solution!");
    		else
    		{
    			printf("%d %d\n",st+1-ans,st);
    			for(int i=st+1-ans;i<=st;i++)
    				printf("%c",str1[i]);
    			puts("");
    		}
    	}
    	return 0;
    }
    		
    

      

  • 相关阅读:
    继百岁版之后的续命版的更新
    重启nginx
    酒吧流行游戏不完全手册
    google实时搜索
    ubuntu 支持gbk
    网页编码
    爬虫日志分析
    feedsky 话题 营销
    python时间日期格式转换
    nginx错误重定向
  • 原文地址:https://www.cnblogs.com/nanke/p/2368436.html
Copyright © 2011-2022 走看看