BZOJ2565:最长双回文串
2565: 最长双回文串
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2195 Solved: 1119
[Submit][Status][Discuss]
Description
顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。
Input
一行由小写英文字母组成的字符串S。
Output
一行一个整数,表示最长双回文子串的长度。
Sample Input
baacaabbacabb
Sample Output
12
HINT
样例说明
从第二个字符开始的字符串aacaabbacabb可分为aacaa与bbacabb两部分,且两者都是回文串。
对于100%的数据,2≤|S|≤10^5
思路{
首先应该建出回文自动机,那么我们可以很自然地想到在插入字符的过程中统计当前插入的字符的长度(因为回文自动机保证了当前插入的字符串是能匹配的最长长度)。
但是还要反向搞一下即可。
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #define inf (1<<30) #define il inline #define RG register #define LL long long #define maxx 100010 using namespace std; char s[maxx]; int nxt[maxx][27],len[maxx],f[maxx],l,cc,Maxpre[maxx],Maxnxt[maxx]; void Insert( int n, int c, int p[]){ int P=l; while (s[n-len[P]-1]!=s[n])P=f[P]; if (!nxt[P][c]){ len[++cc]=len[P]+2; int p=f[P]; while (s[n-len[p]-1]!=s[n])p=f[p]; f[cc]=nxt[p][c],nxt[P][c]=cc; }l=nxt[P][c];p[n]=len[l]; } char t[maxx]; void work(){ f[0]=1,len[++cc]=-1; scanf ( "%s" ,s+1); int L= strlen (s+1); for (RG int i=1;i<=L;++i)Insert(i,s[i]- 'a' ,Maxpre);l=cc=0; memset (nxt,0, sizeof (nxt)); memset (len,0, sizeof (len)); memset (f,0, sizeof (f)); f[0]=1,len[++cc]=-1; for (RG int i=1;i<=L;++i)t[L-i+1]=s[i]; for ( int i=1;i<=L;++i)s[i]=t[i]; for (RG int i=1;i<=L;++i)Insert(i,s[i]- 'a' ,Maxnxt);LL Ans=0; for (RG int i=1;i<=L;++i)Ans=max(Ans,(LL)Maxnxt[i]+Maxpre[L-i]); printf ( "%lld" ,Ans); } int main(){ freopen ( "1.in" , "r" ,stdin); // freopen("1.out","w",stdout); work(); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!