博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2342 [Shoi2011]双倍回文
阅读量:6541 次
发布时间:2019-06-24

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

发现每个可行的答案是两个短的回文串拼成的一个长的回文串

所以短串一定是长串的某个后缀
建出来回文自动机后,在$fail$树$dfs$即可

1 #include
2 #include
3 #include
4 #include
5 #include
6 #define N 500050 7 using namespace std; 8 int nxt[N],len[N],ch[N][26],cnt,last; 9 char s[N];10 void init(){11 nxt[0]=nxt[1]=1;12 len[1]=-1;cnt=1;13 }14 int getfail(int x,int en){15 while(s[en]!=s[en-len[x]-1])x=nxt[x];16 return x;17 }18 int e=1,head[N];19 struct edge{20 int v,next;21 }ed[N];22 void add(int u,int v){23 ed[e].v=v;24 ed[e].next=head[u];25 head[u]=e++;26 }27 int ans;28 int vis[N];29 void insert(int t,int en){30 int now=getfail(last,en);31 if(!ch[now][t]){32 int x=++cnt;33 len[x]=len[now]+2;34 int f=getfail(nxt[now],en);35 nxt[x]=ch[f][t];add(nxt[x],x);36 ch[now][t]=x;37 }38 last=ch[now][t];39 }40 void dfs(int x){41 if(len[x]%4==0&&vis[len[x]>>1])ans=max(ans,len[x]);42 vis[len[x]]++;43 for(int i=head[x];i;i=ed[i].next)44 dfs(ed[i].v);45 vis[len[x]]--;46 }47 int n;48 int main(){49 init();50 scanf("%d",&n);51 scanf("%s",s);52 for(int i=0;i
View Code

 

转载于:https://www.cnblogs.com/Ren-Ivan/p/8119776.html

你可能感兴趣的文章
windows磁盘扩容(动态磁盘)
查看>>
在jsp页面中添加富文本编译器(ueditor)+ 图片上传功能
查看>>
fedora12下安装oracle11客户端
查看>>
实现批量添加20个用户,用户名为user1-50,密码为user后面跟5个随机字符
查看>>
LVM磁盘管理
查看>>
Net命令详解
查看>>
CentOS linux 高可用集群之heartbeat
查看>>
用bat更改hosts文件批处理
查看>>
Logwatch日志分析工具
查看>>
docker 基本操作Ⅱ(关于镜像操作)
查看>>
分工與合作
查看>>
轻松设置站点对ASP危险组件的调用权限
查看>>
看懂“拜占庭容错”,也就看懂了区块链的核心技术
查看>>
APMServ 5.2.6 Win7 Apache启动失败,请检查相关配置
查看>>
了解痘痘起因才能彻底告别痘痘烦恼
查看>>
Zabbix安装
查看>>
Java 日志 详解
查看>>
openstack虚拟化技术和镜像制作
查看>>
一个超棒的jQuery通知栏插件 - jBar
查看>>
分享17个漂亮的电子商务网站
查看>>