[Contest20180311]朋友
是毒瘤的friends呢~
注意到“产生感情”和后缀自动机的$Right$集合定义很像,所以先对所有串建广义sam,那么一个节点$s$里的所有串都互相产生感情,而从起点走到$s$走最长路所经过的节点里的串都和$s$的串认识(因为是前缀关系)
所以这题其实是求用最少的仅在起点相交的链覆盖广义sam
把每个节点拆成两个点,连一条容量限制为$[1,1]$的边,对于所有原sam中的转移,连一条边$[0,1]$,最后新建一个汇点,把所有非起点的点连一条$[0,1]$到汇点,跑最小流即可
这样做保证每个点都仅被经过一次且路径不相交
关于上下界网络流,可以去看一看zyz的博客,这里不乱写了
p.s.dicnic加了优化真的是可以为所欲为的,不加就直接被kill掉,加了就100msA掉,代码中有注释符号的地方就是优化
#include<stdio.h> #include<string.h> #define inf 10000000 int min(int a,int b){return a<b?a:b;} namespace gra{ int h[20010],cur[20010],to[300010],nex[300010],cap[300010],M=1,s,t,ss,tt; bool ex[300010]; void eadd(int a,int b,int c,bool d){ M++; to[M]=b; cap[M]=c; ex[M]=d; nex[M]=h[a]; h[a]=M; M++; to[M]=a; cap[M]=0; nex[M]=h[b]; h[b]=M; } int dis[20010],q[140010]; bool bfs(){ int head=1,tail=1,x,i; q[1]=ss; memset(dis,-1,sizeof(dis)); dis[ss]=0; while(head<=tail){ x=q[head]; head++; for(i=h[x];i;i=nex[i]){ if(dis[to[i]]==-1&&cap[i]>0){ dis[to[i]]=dis[x]+1; if(to[i]==tt)return 1;// tail++; q[tail]=to[i]; } } } return dis[tt]>0; } int dfs(int x,int flow){ if(x==tt)return flow; int i,f; for(i=cur[x];i;i=nex[i]){// if(cap[i]>0&&dis[to[i]]==dis[x]+1){ f=dfs(to[i],min(flow,cap[i])); if(f){ cap[i]-=f; cap[i^1]+=f; if(cap[i])cur[x]=i;// return f; } } } dis[x]=-1;// return 0; } int dicnic(){ int ans=0,tmp; while(bfs()){ memcpy(cur,h,sizeof(h));// while(tmp=dfs(ss,inf))ans+=tmp; } return ans; } void gao(){ dicnic(); eadd(t,s,inf,0); s=dicnic(); for(int i=2;i<=M;i++){ if(ex[i]&&cap[i]!=0){ s=0; break; } } printf("%d",s); } } namespace str{ struct sam{ int ch[1010],fa,v; }t[10010]; int M=1; int extend(int p,int c){ int q,nq; if(t[p].ch[c]){ q=t[p].ch[c]; if(t[q].v==t[p].v+1) return q; else{ nq=++M; t[nq]=t[q]; t[nq].v=t[p].v+1; t[q].fa=nq; while(p&&t[p].ch[c]==q){ t[p].ch[c]=nq; p=t[p].fa; } return nq; } }else{ int np=++M; t[np].v=t[p].v+1; while(p&&t[p].ch[c]==0){ t[p].ch[c]=np; p=t[p].fa; } if(p==0) t[np].fa=1; else{ q=t[p].ch[c]; if(t[q].v==t[p].v+1) t[np].fa=q; else{ nq=++M; t[nq]=t[q]; t[nq].v=t[p].v+1; t[np].fa=t[q].fa=nq; while(p&&t[p].ch[c]==q){ t[p].ch[c]=nq; p=t[p].fa; } } } return np; } } int x[5010]; void gao(){ int k,m,n,i,j; scanf("%d%d",&k,&m); while(m--){ scanf("%d",&n); i=1; while(n--){ scanf("%d",&j); i=extend(i,j); } } gra::s=1; gra::t=M+1; gra::ss=M<<1|1; gra::tt=(M<<1)+2; for(i=1;i<=k;i++){ if(t[1].ch[i])gra::eadd(1,t[1].ch[i],inf,0); } for(i=2;i<=M;i++){ gra::eadd(gra::ss,i+M,1,1); gra::eadd(i,gra::tt,1,1); for(j=1;j<=k;j++){ if(t[i].ch[j])gra::eadd(i+M,t[i].ch[j],1,0); } gra::eadd(i+M,M+1,1,0); } } } int main(){ str::gao(); gra::gao(); }
[Contest20180311]朋友的更多相关文章
- QQ空间/朋友圈类界面的搭建
类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...
- 2017《时间的朋友》罗振宇跨年演讲ppt
2016年12月31日晚,罗辑思维的罗振宇将在深圳湾春茧体育馆进行2017<时间的朋友>跨年演讲,很多网友一直在找直播的地址还是没找到,现在ytkah就第一时间分享一些精彩ppt弥补网友的 ...
- Python微信-- 分享接口(分享到朋友圈、朋友、空间)
生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...
- Apple Watch版微信来了 收发微信刷朋友圈不在话下
昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...
- UC浏览器 分享到朋友圈和微信好友 分类: JavaScript 2015-04-28 14:45 615人阅读 评论(1) 收藏
用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...
- <把时间当做朋友>读书笔记
这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...
- MWeb 2.0 测试版可以下载啦,这次是公开测试,感兴趣的朋友可以试试
2.0 版是 MWeb 发布以来,最重要的一个版本.MWeb 自去年一月份发布以来,获得了很多朋友的建议,在此非常感谢!没有你们,2.0 版可能就不能出来!然后再次感谢 Producter: http ...
- hduoj 1286 找新朋友
http://acm.hdu.edu.cn/showproblem.php?pid=1286 找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- iOS版微信朋友圈数据库的简要分析
本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/4550523.html 之前写了一些关于微信聊天记录的博文之后,不少 ...
随机推荐
- 解决IIS设置多个工作进程中Session失效的问题
利用StateServer实现Session共享 session保存在专门的StateServer中,该种方式,性能损失比sql略好.比inproc据说有10%-15%的性能损失.怎么使用StateS ...
- 编写clearedit的安卓控件
1.写一个自定义的控件 public class ClearEditText extends AppCompatEditText implements View.OnFocusChangeListen ...
- codeforces803D. Magazine Ad
D. Magazine Adtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutput ...
- 初识 spl_autoload_register
spl_autoload_register 一.首先我们看来自官网的定义 版本要求:php版本为5.1.2+ 说明:注册给定的函数作为__autoload的实现.即自动加载 函数参数说明: bool ...
- springboot部署多个vue项目
在springboot下部署多个vue项目,只需要将vue打包成静态文件后,将其放在resources的静态文件夹下即可. 如下图:static目录下有三个vue的静态文件夹,分别为运营后台(admi ...
- 51nod1031(简单斐波拉契数列)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1031 题意:中文题诶- 思路:对于第x块骨牌的情况,我们用a ...
- 【BZOJ1468】Tree [点分治]
Tree Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距 ...
- 【STSRM12】夏令营
[题意]n个数划分成k段,每段的价值为段内不同数字的数量,求最大总价值 [算法]DP+线段树 [题解] f[i][j]表示前i个数字划分成j段的最大价值. f[i][j]=max(f[k][j-1]+ ...
- 数据安全之MD5、SHA-1、CRC32区别
crc32 — 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式……:这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式 ...
- C/C++里的const(2)
对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢? const int a; int const a; const int *a; int *const a; int ...