[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 之前写了一些关于微信聊天记录的博文之后,不少 ...
随机推荐
- strings用法小记
By francis_hao Feb 14,2017 打印文件中可打印字符,每个序列至少四(可配置)个字符长.主要用于显示非文本文件 概述 选项解释 -a --all - 扫描整个文件,不管 ...
- ng双向数据绑定
http://blog.csdn.net/callmekongkong/article/details/54601585
- JAVA多线程---好的博客资源收集
个人笔记,备忘 1.http://blog.csdn.net/column/details/concurrency.html 兰亭风雨的专栏 2.http://lavasoft.blog.51c ...
- Cannot load project: com.intellij.ide.plugins.PluginManager$StartupAbortedException
今天电脑突然蓝屏,idea异常关闭,开机重启后,打开idea,点击项目出现 Cannot load project: com.intellij.ide.plugins.PluginManager$St ...
- 调用webservice接口
这里是cxf服务器,采用myeclipse6.5,把wsdl放到本地的方式. 新建一个包, 把解析到的类放在这个包下面. 生成的代码结构: 调用: public static String callI ...
- Spring MVC框架下 将数据库内容前台页面显示完整版【获取数据库人员参与的事件列表】
1.书写jsp页面包括要显示的内容[people.jsp] <!-- 此处包括三个方面内容: 1.包含 文本输入框 查询按钮 查询结果显示位置 (paging) 2.包括对按钮(button) ...
- 【BZOJ2742】【HEOI2012】Akai的数学作业 [数论]
Akai的数学作业 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 这里是广袤无垠的宇宙这里 ...
- poj 2312 Battle City(优先队列+bfs)
题目链接:http://poj.org/problem?id=2312 题目大意:给出一个n*m的矩阵,其中Y是起点,T是终点,B和E可以走,S和R不可以走,要注意的是走B需要2分钟,走E需要一分钟. ...
- Red Hat EX413 通过笔记
最近通过了EX413考试,在这里记录一下- EX413是Red Hat RH413对应的考试,RH413主要涉及Linux主机加固内容.考试大概18题的样子,给两台虚拟机,然后按照各个题目要求进行安全 ...
- Linux ssh的使用
1.查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用Op ...