POJ--3974 Palindrome(回文串,hash)

Posted dyloder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ--3974 Palindrome(回文串,hash)相关的知识,希望对你有一定的参考价值。

链接:点击这里

 

 

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
using namespace std;
#define maxn 1000005
#define LL long long
#define ull unsigned long long
const LL P = 131;
ull p[maxn+10],f[maxn],ff[maxn];
int main(){
   p[0]=1;
   for(int j=1;j<=maxn;j++){
      p[j]=p[j-1]*P;
   }
   string s;
   int tot=1;
   while(cin>>s){
      if(s=="END") break;
      f[0]=0,ff[0]=0;
      int ans=0;
      int len=s.size();
      for(int j=1;j<=len;j++){
         f[j]=f[j-1]*P+s[j-1]-a+1;
      }
      for(int j=len;j>=1;j--){
        ff[j]=ff[j+1]*P+s[j-1]-a+1;
      }
      for(int j=1;j<=len;j++){
         int l=1,r=min(len-j,j),mx=0;
         while(l<=r){    // 偶数
            int mid=(l+r)/2;
            int l1=j-mid+1,r1=j;
            int l2=j+1,r2=j+mid;
            LL ll=f[r1]-f[l1-1]*p[r1-l1+1];
            LL rr=ff[l2]-ff[r2+1]*p[r2-l2+1];
            if(ll==rr){
               mx=max(mx,mid);
               l=mid+1;
            }else r=mid-1;
         }
         ans=max(ans,2*mx);
         l=1,r=min(len-j,j-1),mx=0;
         while(l<=r){     //奇数
            int mid=(l+r)/2;
            int l1=j-mid,r1=j-1;
            int l2=j+1,r2=j+mid;
            LL ll=f[r1]-f[l1-1]*p[r1-l1+1];
            LL rr=ff[l2]-ff[r2+1]*p[r2-l2+1];
            if(ll==rr){
               mx=max(mx,mid);
               l=mid+1;
            }else r=mid-1;
         }
         ans=max(ans,2*mx+1);
      }
      //cout<<ans<<endl;
      printf("Case %d: %d
",tot++,ans);
   }
   return 0;
}

 

以上是关于POJ--3974 Palindrome(回文串,hash)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3974 Palindrome 字符串 Manacher算法

POJ3974:Palindrome——题解

poj3974 Palindrome

poj3974 Palindrome

poj3974 Palindrome回文Hash

POJ 3974 回文串-Manacher