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;
    }
    		
    

      

  • 相关阅读:
    2017.10.12
    2017.10.25
    2017.10.24
    进度条06
    课堂练习(返回一个环状一维整数数组中最大子数组的和)
    团队项目成员和题目
    团队作业--四则运算网页版
    进度条04
    个人作业(最大子数组)
    进度条03
  • 原文地址:https://www.cnblogs.com/nanke/p/2368436.html
Copyright © 2011-2022 走看看