枚举回文串的中心点 ,二分左右的长度
判断两个字符串时用hash
#include<iostream> #include <algorithm> #include <cstring> using namespace std; #define ll unsigned long long const int N=1e6+5; char a[N]; ll h1[N],h2[N],pow[N]; ll bas=131; ll f1(int l,int r){ return h1[r]-h1[l-1]*pow[r-l+1]; } ll f2(int l,int r){ return h2[l]-h2[r+1]*pow[r-l+1]; } void sov(int cas){ int i,j,l,r; h1[0]=h2[0]=0; int ans=0; int n=strlen(a+1); h2[n+1]=0; for(i=1,j=n;i<=n;i++,j--){ h1[i]=h1[i-1]*bas+a[i]; h2[j]=h2[j+1]*bas+a[j]; } for(i=1;i<=n;i++){ l=0,r=min(i,n-i); int t=0; while(l<=r){ int md=(l+r)/2; if(f1(i-md,i-1)==f2(i+1,i+md)) l=md+1,t=md; else r=md-1; } ans=max(ans,t*2+1); } for(i=1;i<=n;i++){ l=0,r=min(i-1,n-i+1); int t=0; while(l<=r){ int md=(l+r)/2; if(f1(i-md,i-1)==f2(i,i+md-1)) l=md+1,t=md; else r=md-1; } ans=max(ans,t*2); } printf("Case %d: %d\n",cas,ans); } main(){ int i; pow[0]=1; for(i=1;i<=1e6;i++) pow[i]=pow[i-1]*bas; int cas=0; while(cin>>a+1,a[1]!='E'){ sov(++cas); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!