码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-30 22:07:38      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:div   回文   printf   poj   style   ash   pac   end   nbsp   

链接:点击这里

 

 

#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\n",tot++,ans);
   }
   return 0;
}

 

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

标签:div   回文   printf   poj   style   ash   pac   end   nbsp   

原文地址:https://www.cnblogs.com/DyLoder/p/10200569.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!