HDU-3294 Girls' research

题目链接:https://vjudge.net/problem/HDU-3294

还是套Manacher模板,需要自己做的是,计算最长回文子串的左右端点,转化字符串输出

#include
#include
#include
#include
#include
using namespace std;
const int maxn=2*1e5+10;
char str[maxn];//原字符串
char tmp[maxn<<1];//转换后的字符串
int Len[maxn<<1];
//转换原始串
int INIT(char *st)
{
    int i,len=strlen(st);
    tmp[0]='@';//字符串开头增加一个特殊字符,防止越界
    for(i=1;i<=2*len;i+=2)
    {
        tmp[i]='#';
        tmp[i+1]=st[i/2];
    }
    tmp[2*len+1]='#';
    tmp[2*len+2]='$';//字符串结尾加一个字符,防止越界
    tmp[2*len+3]=0;
    return 2*len+1;//返回转换字符串的长度
}
//Manacher算法计算过程
int l,r; 
int MANACHER(char *st,int len)
{
     int mx=0,ans=0,po=0;//mx即为当前计算回文串最右边字符的最大值
     for(int i=1;i<=len;i++) //从1开始的 
     {
         if(mx>i)
         Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取个小
         else
         Len[i]=1;//如果i>=mx,要从头开始匹配
         while(st[i-Len[i]]==st[i+Len[i]])
         Len[i]++;
         if(Len[i]+i>mx)//若新计算的回文串右端点位置大于mx,要更新po和mx的值
         {
             mx=Len[i]+i;
             po=i;
         }
         if(Len[i]>ans) 
         {
         	ans=Len[i];
         	//cout<1)
		{
			printf("%d %d\n",l,r); 
			int t=c-'a';
			for(int i=l;i<=r;i++)
			printf("%c",'a'+(str[i]-'a'-t+26)%26);
			printf("\n");
		}
		else printf("No solution!\n");
	}
	return 0;
} 


你可能感兴趣的:(HDU-3294 Girls' research)