poj3974 hdu3068最长回文子串 如果让我说:我只能说,实力决定一切

思路:简单题目,利用Manacher()方法,解决问题的方法和KMP类是,避免了冗余操作,可以提高效率
poj3974:

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
char pat[1000100*2];
char tem[1000100];
int sum[1000100*2];
int pox;
int MIN(int a,int b)
{
    return a>b?b:a;
}
void init()
{
    int Len=strlen(tem);
    pat[0]='&';
    pox=1;
    for(int i=0; i<Len; i++)
    {
        pat[pox++]='#';
        pat[pox++]=tem[i];
    }
    pat[pox]='#';
}
void Manacher()
{
    int id=0,aMax=0;
    for(int i=0;i<=pox;i++)
    {
        if(aMax>i)
        {
            sum[i]=MIN(sum[2*id-i],aMax-i);
        }
        else sum[i]=1;
        while(pat[i+sum[i]]==pat[i-sum[i]])
        {
            ++sum[i];
        }
        if(i+sum[i]>aMax)
        {
            aMax=i+sum[i];
            id=i;
        }
    }
}
int main()
{
    int ans;
    int step=1;
    while(scanf("%s",tem)!=EOF)
    {
        ans=0;
        if(strcmp(tem,"END")==0)
            break;
          init();
       //   printf("%s\n",pat);
          Manacher();
          for(int i=0;i<=pox;i++)
            if(ans<sum[i])
              ans=sum[i];
        printf("Case %d: %d\n",step++,ans-1);
    }
    return 0;
}

 

 

 

 

 

 

 

 


hdu3068:

#include<iostream>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
char tem[110100];
char pat[110100*2];
int sum[110100*2];
int pox;
int MIN(int a,int b)
{
    return a>b?b:a;
}
void init()
{
    pox=1;
    int Len=strlen(tem);
    pat[0]='&';
    for(int i=0; i<Len; i++)
    {
        pat[pox++]='#';
        pat[pox++]=tem[i];
    }
    pat[pox]='#';
}
void Manacher()
{
    int id=0,aMax=0;
    for(int i=0;i<=pox;i++)
    {
        if(aMax>i)//判断之前是否存在回文串
        {
            sum[i]=MIN(sum[2*id-i],aMax-i);//找一个最小的值,避免出现失误。
        }
        else sum[i]=1;
        while(pat[i+sum[i]]==pat[i-sum[i]])
        {
            ++sum[i];
        }
        if(i+sum[i]>aMax)// 将aMax推进到 是 回文串  的后面
        {
            aMax=i+sum[i];
            id=i;
        }
    }
}
int main()
{
    int ans=0;
    while(scanf("%s",tem)!=EOF)
    {
        ans=0;
        memset(sum,0,sizeof(sum));
        init();
        Manacher();
        for(int i=0;i<pox;i++)
         if(ans<sum[i])
           ans=sum[i];
        printf("%d\n",ans-1);
    }
    return 0;
}


 

你可能感兴趣的:(poj3974 hdu3068最长回文子串 如果让我说:我只能说,实力决定一切)