博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2565: 最长双回文串 pam
阅读量:5311 次
发布时间:2019-06-14

本文共 2718 字,大约阅读时间需要 9 分钟。

题意:找一个串中的最长连续两个回文子串长度

题解:建两个回文树,一个正着,一个反着,每次add之后last的长度就是后缀最长的回文串长度,然后两边加一遍即可

/**************************************************************    Problem: 2565    User: walfy    Language: C++    Result: Accepted    Time:164 ms    Memory:49928 kb****************************************************************/ //#pragma GCC optimize(2)//#pragma GCC optimize(3)//#pragma GCC optimize(4)//#pragma GCC optimize("unroll-loops")//#pragma comment(linker, "/stack:200000000")//#pragma GCC optimize("Ofast,no-stack-protector")//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")#include
#define fi first#define se second#define db double#define mp make_pair#define pb push_back#define pi acos(-1.0)#define ll long long#define vi vector
#define mod 998244353#define ld long double#define C 0.5772156649#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1#define pll pair
#define pil pair
#define pli pair
#define pii pair
//#define cd complex
#define ull unsigned long long#define base 1000000000000000000#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))#define fin freopen("a.txt","r",stdin)#define fout freopen("a.txt","w",stdout)#define fio ios::sync_with_stdio(false);cin.tie(0)template
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}template
inline T const& MIN(T const &a,T const &b){return a
=mod)a-=mod;}inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const double eps=1e-8;const ll INF=0x3f3f3f3f3f3f3f3f;const int N=200000+10,maxn=400000+10,inf=0x3f3f3f3f; struct PAM{ int ch[N][26],fail[N],cnt[N],len[N],s[N],ans[N]; int last,n,p; int newnode(int w) { for(int i=0;i<26;i++)ch[p][i] = 0; cnt[p] = 0; len[p] = w; return p++; } void init() { p = last = n = 0; newnode(0); newnode(-1); s[n] = -1; fail[0] = 1; } int getfail(int x) { while(s[n-len[x]-1] != s[n]) x = fail[x]; return x; } void add(int c) { s[++n] = c; int cur = getfail(last); if(!ch[cur][c]){ int now = newnode(len[cur]+2); fail[now] = ch[getfail(fail[cur])][c]; ch[cur][c] = now; } last = ch[cur][c]; ans[n]=len[last]; cnt[last]++; }}pam1,pam2;char s[N];int main(){ pam1.init(),pam2.init(); scanf("%s",s+1); int len=strlen(s+1); for(int i=1;i<=len;i++)pam1.add(s[i]-'a'); reverse(s+1,s+len+1); for(int i=1;i<=len;i++)pam2.add(s[i]-'a'); int res=0; for(int i=1;i

转载于:https://www.cnblogs.com/acjiumeng/p/9595693.html

你可能感兴趣的文章
1007. Maximum Subsequence Sum (25)
查看>>
图片生成缩略图
查看>>
查看oracle数据库的连接数以及用户
查看>>
【数据结构】栈结构操作示例
查看>>
三.野指针和free
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>