1. 程式人生 > 其它 >【YBTOJ】迴文子串

【YBTOJ】迴文子串

技術標籤:題解hash

在這裡插入圖片描述

思路:

首先我們把字串存到hash陣列當中,然後思考怎樣判斷
我們可以列舉中心位置,然後二分長度,用字串hash判斷是否對稱就行
注意要判斷長度奇偶

c o d e code code

#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
char s[1000100];
unsigned long long up[1000100], down[1000100], f[1000100];
int main()
{
	scanf("%s", s+
1); int n=strlen(s+1); int m=0; while(s[1]!='E'||s[2]!='N'||s[3]!='D') { f[0]=1; for(int i=1; i<=n; i++) { f[i]=f[i-1]*131ull; up[i]=up[i-1]*131ull+s[i]-'a'; } down[n+1]=0; for(int i=n; i>=1; i--) down[i]=down[i+1]*131ull+s[i]-'a'; int ans=0; for(int i=1; i<=n; i++)
{ int l=0, r=n; while(l<=r) { int mid=l+r>>1; if(i-mid<1||i+mid>n) r=mid-1; else if(up[i]-up[i-mid-1]*f[mid+1]==down[i]-down[i+mid+1]*f[mid+1]) ans=max(ans, mid*2+1), l=mid+1; else r=mid-1; } l=0, r=n; while(l<=r) { int mid=
l+r>>1; if(i-mid<0||i+mid>n) r=mid-1; else if(up[i]-up[i-mid]*f[mid]==down[i+1]-down[i+mid+1]*f[mid]) ans=max(ans, mid*2), l=mid+1; else r=mid-1; } } m++; printf("Case %d: %d\n", m, ans); memset(down, 0, sizeof(down)); scanf("%s", s+1); n=strlen(s+1); } return 0; } /*abcbabcbabcba*/