bzoj3654 图样图森破
非常好的一道题
我们把每个串正反拆成两个串,对于每个正串的所有节点,我们对他们和其他反串的起始位置进行判断lcp,如果这个节点后面的字符串和某个反串的lcp长度等于这个节点后面的字符串长度,那么我们就从这个节点向那个反串的开头连一个边权为二倍长度的边,如果lcp长度等于反串的总长时,我们就连向该节点后面的长度的节点,边权也是二倍lcp的长度,如果lcp不满的话,就连向T,都满的话,直接输出inf,另外,对于每个以串起始位置为左端点的回文串,我们从S向这个串后面的节点连边权为长度的边,可以发现这样在全图跑一个最长路就是最终的答案,如果有环就是inf;
证明什么的比较显然,画画图就出来了。
貌似还有更快的dfs做法,但是我不会。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <cmath> 6 #include <queue> 7 #define N 200505 8 using namespace std; 9 int n,m,len[105],zzh; 10 char s[105][N]; 11 namespace graph{ 12 int e=1,head[N],S,pp[N]; 13 struct edge{ 14 int v,w,next; 15 }ed[N<<7]; 16 void add(int u,int v,int w){ 17 if(u==v)return; 18 if(v==S+1){ 19 if(pp[u]){ed[pp[u]].w=max(ed[pp[u]].w,w);return;} 20 else pp[u]=e; 21 } 22 ed[e].v=v;ed[e].w=w; 23 ed[e].next=head[u];head[u]=e++; 24 } 25 long long ans,D[N]; 26 bool vis[N],flag=0; 27 void dfs(int x,long long dis){ 28 if(flag)return; 29 D[x]=dis;ans=max(ans,dis);vis[x]=1; 30 for(int i=head[x];i;i=ed[i].next){ 31 int v=ed[i].v; 32 if(vis[v]){flag=1;return;} 33 if(D[v]<=(long long)dis+ed[i].w)dfs(v,dis+ed[i].w); 34 }vis[x]=0; 35 } 36 void work(){ 37 dfs(S,0); 38 if(flag)puts("Infinity"); 39 else printf("%d\n",ans); 40 } 41 } 42 namespace manacher{ 43 int mx,pos,cnt,num[N],r[N],n; 44 char s[N]; 45 void manacher(char *ch){ 46 n=strlen(ch); 47 for(int i=0;i<n;i++)s[i]=ch[i]; 48 for(int i=n-1;~i;i--)s[2*i]=s[i],s[2*i+1]='#';n<<=1; 49 mx=pos=cnt=0; 50 num[++cnt]=0; 51 for(int i=0;i<n;i++){ 52 if(i<mx)r[i]=min(r[2*pos-i],mx-i); 53 else r[i]=1; 54 while(i-r[i]>=0&&i+r[i]<n&&s[i-r[i]]==s[i+r[i]])r[i]++; 55 if(i+r[i]>mx)pos=i,mx=i+r[i]; 56 if(i-r[i]+1==0)num[++cnt]=((i+r[i]-1)>>1)+1; 57 if(i&1)graph::ans=max(graph::ans,(long long)(r[i]>>1)<<1); 58 else graph::ans=max(graph::ans,(long long)(((r[i]+1)>>1)<<1)-1); 59 } 60 } 61 } 62 namespace sa{ 63 int buc[N],wa[N],wb[N]; 64 int sa[N],rank[N],height[N],r[N],n; 65 char s[N]; 66 bool cmp(int *d,int a,int b,int c){ 67 return d[a]==d[b]&&d[a+c]==d[b+c]; 68 } 69 void getheight(int n){ 70 int i,j,k=0; 71 for(i=0;i<n;i++)rank[sa[i]]=i; 72 for(i=0;i<n;height[rank[i++]]=k) 73 for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); 74 return ; 75 } 76 void da(int n,int m=130){ 77 int i,j,p,*x=wa,*y=wb; 78 for(i=0;i<m;i++)buc[i]=0; 79 for(i=0;i<n;i++)buc[x[i]=r[i]]++; 80 for(i=1;i<m;i++)buc[i]+=buc[i-1]; 81 for(i=n-1;~i;i--)sa[--buc[x[i]]]=i; 82 for(j=1,p=0;p<n;j<<=1,m=p){ 83 for(p=0,i=n-j;i<n;i++)y[p++]=i; 84 for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j; 85 for(i=0;i<m;i++)buc[i]=0; 86 for(i=0;i<n;i++)buc[x[y[i]]]++; 87 for(i=1;i<m;i++)buc[i]+=buc[i-1]; 88 for(i=n-1;~i;i--)sa[--buc[x[y[i]]]]=y[i]; 89 for(swap(x,y),i=1,x[sa[0]]=0,p=1;i<n;i++) 90 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 91 } 92 getheight(n); 93 } 94 int minn[N][20]; 95 void st_init(){ 96 for(int i=1;i<=n;i++)minn[i][0]=height[i]; 97 for(int j=1;(1<<j)<=n;j++) 98 for(int i=1;i+(1<<j)-1<=n;i++) 99 minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]); 100 } 101 int work(){ 102 da(n+1); 103 st_init(); 104 } 105 int find(int x,int y){ 106 x=rank[x],y=rank[y]; 107 if(x>y)swap(x,y);x++; 108 int k=0; 109 while(x+(1<<k+1)-1<=y)k++; 110 return min(minn[x][k],minn[y-(1<<k)+1][k]); 111 } 112 } 113 int main(){ 114 scanf("%d",&n); 115 for(int i=1;i<=n;i++){ 116 scanf("%s",s[++m]); 117 len[m]=len[m+1]=strlen(s[m]);m++; 118 for(int i=0;i<len[m];i++) 119 s[m][i]=s[m-1][len[m]-1-i]; 120 len[m-1]+=len[m-2];len[m]+=len[m-1]; 121 } 122 for(int i=1;i<=m;i++){ 123 for(int j=0;j<len[i]-len[i-1];j++) 124 sa::r[sa::n++]=s[i][j]; 125 sa::r[sa::n++]='#'; 126 } 127 memset(graph::pp,0,sizeof graph::pp); 128 memset(graph::head,0,sizeof graph::head); 129 sa::work(); 130 graph::S=len[m]; 131 for(int i=1;i<=m;i++){ 132 manacher::manacher(s[i]); 133 for(int j=1;j<=manacher::cnt;j++)if(j==1||manacher::num[j]!=manacher::num[j-1]){ 134 if(manacher::num[j]==len[i]-len[i-1]){puts("Infinity");return 0;} 135 graph::add(graph::S,len[i-1]+manacher::num[j],manacher::num[j]); 136 } 137 for(int j=0;j<len[i]-len[i-1];j++){ 138 for(int k=(i&1)?2:1;k<=m;k+=2){ 139 int f=sa::find(len[i-1]+i-1+j,len[k-1]+k-1); 140 int l1=len[i]-len[i-1]-j,l2=len[k]-len[k-1]; 141 if(f==l1&&f==l2){puts("Infinity");return 0;} 142 if(f){ 143 if(f!=l1&&f!=l2)graph::add(len[i-1]+j,graph::S+1,2*f); 144 if(f==l1)graph::add(len[i-1]+j,len[k-1]+(len[i]-len[i-1]-j),2*f); 145 if(f==l2)graph::add(len[i-1]+j,len[i-1]+j+f,2*f); 146 } 147 } 148 } 149 } 150 graph::work(); 151 return 0; 152 }
View Code
转载于:https://www.cnblogs.com/Ren-Ivan/p/8370548.html
bzoj3654 图样图森破相关推荐
- 【清华夏令营2016模拟5.31】图森破
题目 Description 小火车励志成为一名辣鸡出题人,但是要成为一名辣鸡出题人,代码必须跑得比谁都快,这样就能把他们都卡常数了!为了锻炼自己,他找到了一位长者--罗长者,罗长者说:"你 ...
- 题解 [校内测试]图森破
题意 设 f(n)f(n)f(n) 为满足以下条件的字符串个数: 串长为 SSS,字符集为 [0,9][0,9][0,9]. 设 sufisuf_isufi 为第 iii 个字符对应的后缀在最后补 ...
- GitHub上7000+ Star的Python常用代码合集
作者 | 二胖并不胖 来源 | 大数据前沿(ID:bigdataqianyan) 今天二胖给大家介绍一个由一个国外小哥用好几年时间维护的Python代码合集.简单来说就是,这个程序员小哥在几年前开始保 ...
- 心中无码,自然高清 | 联合去马赛克与超分辨率研究论文Pytorch复现
作者 | 知凡,个人公众号:林木蔚然读书会(ID:EspressoOcean),知乎ID:Uno Whoiam 本文授权转载自知乎 本文结构 简单扫盲 什么是去马赛克 什么是超分辨率 <Deep ...
- 算法面试经常需要你手写的三个排序算法(Python语言)
作者 | 程序员小吴 来源 | 五分钟学算法(ID: CXYxiaowu) 1. 归并排序 1.1 算法步骤 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 设定两个指针,最初 ...
- 开放式创新改变世界——OpenStack生态系统将重新洗牌
摘要:OpenStack基础软件开发周期长.投入大.技术创新转化成产品需要更多时间,超越公司的开放协作才有利于和促进产业繁荣发展.OpenStack能否成为继Linux之后开放式创新的又一成功案例呢? ...
- LocalDateTime、OffsetDateTime、ZonedDateTime互转,这一篇绝对喂饱你
在JSR 310日期时间体系了,一共有三个API可用于表示日期时间: LocalDateTime:本地日期时间 OffsetDateTime:带偏移量的日期时间 ZonedDateTime:带时区的日 ...
- 创业者如何小步快跑,从0开始实现自己的产品?
2019独角兽企业重金招聘Python工程师标准>>> 某周末和学员聊完,兴起,在在行上的分类里面找自己.可是在产品里面,找来找去,完全不见踪影,反而在研发和运营里面找到了我的话题, ...
- U-Mail邮件网关测试勒索病毒样例图
俗话说得好,"患难见真情",也就是说平时看上去山盟海誓甜言蜜语,但一到危机关头各自飞了:同样的,日常上网看到各种平台言之凿凿的夸下海口说自己的平台固若金汤,对病毒防范一级棒,但最近 ...
- java jni 参数_Java 与 JNI 互传数据的那些事
常规类型的传递 这部分算是 JNI 的基本内容, 理所当然的有一大坨接口来干这些事情, 比如 NewString, GetStringChars, GetArrayLength, NewByteArr ...
最新文章
- maven引入hadoop_如何添加Hadoop依赖通过Maven
- 基于redis的cas集群配置(转)
- python 调用c++返回char*
- 深度学习之利用TensorFlow实现简单的全连接层网络(MNIST数据集)
- 【Python】电商用户复购数据实战:图解Pandas的移动函数shift
- 数据中心两种常用流量模型运用mininet的实现
- C语言 __FUNCTION__ - C语言零基础入门教程
- 各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。...
- Linux设备模型 (1)
- 这样设计算机屏幕保护,屏幕保护程序怎么设置图文教程
- 高数_第1章空间解析几何与向量代数__直线方程
- sumif单列求和_Sumif、Sumifs单列多条件求和-阿里云开发者社区
- 中望3d快捷键命令大全_中望3D快捷键设置
- 手机图形计算器matlab,Mathlab图形计算器
- counter计数器
- python影评_用Python分析18万条《八佰》影评,看看观众怎么说?
- SpringBoot整合Activiti Modeler可视化流程定制
- 苹果手机7P ios14 nfc怎么复制门禁卡
- 新媒体运营教程:如何用直播进行裂变+转化?
- 第三周作业#183;
热门文章
- 什么是对象存储OSS,看完你就懂了
- 如何快速查询手机号码归属地和运营商
- 如何将mov格式转换成mp4并且不改变分辨率
- 西安工业大学计算机考研分数线,西安工业大学研究生录取分数线
- html5仿微博代码仿新浪微博,CSS3网页制作实例:模仿新浪微博首页变化_css
- windows 7 专业版 64位 无法安装.Net 4.7版本解决方案
- java-php-python-springboot网上租贸系统计算机毕业设计
- 医药电商平台解决方案
- Emscripten 单词_人教版英语七年级下册单词、课文及音频汇总
- UWP 写入图片 Exif 信息