HDU-3068-最长回文-马拉车算法模板题
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000Output每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 const int N=110020; 6 7 char a[N]; 8 char m[N*2]; 9 int f[N*2]; 10 int k; 11 12 void manacher(char *a,int len) 13 { 14 k=0; 15 m[k++]='$'; 16 m[k++]='#'; 17 for(int i=0; i<len; i++) 18 { 19 m[k++]=a[i]; 20 m[k++]='#'; 21 } 22 m[k]='\0';//或者加其他的只要不是#$字母都可以 23 int mx=0,id=0; 24 for(int i=1; i<k; i++) //?? 25 { 26 // if(mx-i<=ans[i]) 27 // ans[i]=mx-i; 28 // else if(mx-i>ans[i]) 29 if(i>=mx) 30 f[i]=1; 31 else if(i<mx) 32 { 33 // f[i]=min(f[2*id-i],mx-i); 34 if(mx-i>=f[2*id-i])//if(mx-i<=f[j]) 35 f[i]=f[2*id-i]; 36 else if(mx-i<f[2*id-i])//else if(mx-i<f[j]) 37 f[i]=mx-i; 38 } 39 while(m[i-f[i]]==m[i+f[i]]) 40 f[i]++; 41 if(f[i]+i>mx) 42 { 43 mx=f[i]+i; 44 id=i; 45 } 46 } 47 } 48 49 int main() 50 { 51 while(~scanf("%s",a)) 52 { 53 int len=strlen(a); 54 manacher(a,len); 55 int ans=-1; 56 for(int i=0;i<k;i++) 57 ans=max(ans,f[i]-1); 58 printf("%d\n",ans); 59 } 60 return 0; 61 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」