是毒瘤的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]朋友的更多相关文章

  1. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

  2. 2017《时间的朋友》罗振宇跨年演讲ppt

    2016年12月31日晚,罗辑思维的罗振宇将在深圳湾春茧体育馆进行2017<时间的朋友>跨年演讲,很多网友一直在找直播的地址还是没找到,现在ytkah就第一时间分享一些精彩ppt弥补网友的 ...

  3. Python微信-- 分享接口(分享到朋友圈、朋友、空间)

    生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...

  4. Apple Watch版微信来了 收发微信刷朋友圈不在话下

    昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...

  5. UC浏览器 分享到朋友圈和微信好友 分类: JavaScript 2015-04-28 14:45 615人阅读 评论(1) 收藏

    用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...

  6. <把时间当做朋友>读书笔记

    这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...

  7. MWeb 2.0 测试版可以下载啦,这次是公开测试,感兴趣的朋友可以试试

    2.0 版是 MWeb 发布以来,最重要的一个版本.MWeb 自去年一月份发布以来,获得了很多朋友的建议,在此非常感谢!没有你们,2.0 版可能就不能出来!然后再次感谢 Producter: http ...

  8. hduoj 1286 找新朋友

    http://acm.hdu.edu.cn/showproblem.php?pid=1286 找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  9. iOS版微信朋友圈数据库的简要分析

    本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/4550523.html 之前写了一些关于微信聊天记录的博文之后,不少 ...

随机推荐

  1. POJ 1050 To the Max 二维最大子段和

    To the MaxTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 52281 Accepted: 27633Description ...

  2. 怎么给word加底纹

  3. git 的证书重新设置,以及如何让git 记住提交的用户名和密码

    1.git 的证书的重新设置的命令是: git config --system --unset credential.helper 2.保存git的用户名和密码注意这里是全局保存 git config ...

  4. Sqlserver面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  5. centos网络配置之桥接模式

    一:前沿 来这家公司好久了,都没有开始写博客,都是积累着,都没有去写,今天实在是天激动了,我的虚拟机在配置好了之后折腾了一天都没有折腾出来可以上网,今天来了继续折腾,然后我该ip,改连接方式,我擦,终 ...

  6. POJ 1002 487-3279 (map )

    title: 487-3279 map POJ1002 tags: [map] 题目链接 Description Businesses like to have memorable telephone ...

  7. [bzoj3223]文艺平衡树——splay

    题意 你应当编写一个数据结构,支持以下操作: 反转一个区间 题解 我们把在数组中的位置当作权值,这样原序列就在这种权值意义下有序,我们考虑使用splay维护. 对于操作rev[l,r],我们首先把l- ...

  8. KM算法讲解

    对于二分图,我们可以用匈牙利来求出来最大匹配,但是如果给定每条边一个权值,我们要求这张图的最大匹配最大(小)权,单纯的用匈牙利就没法解决了,当然用费用流也可以做,但是代码较长,在处理完全二分图的时候时 ...

  9. hdu 2016 数据的交换输出

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2016 题目大意:把最小的和第一个交换并输出.注意格式哦! #include <stdio.h&g ...

  10. vim的插件管理与配置

    vim作为我做喜欢的编辑器,可扩展性几乎是没有尽头的,前阵子一直在配置这.vimrc文件,原来搞过配色文件,现在主要就自动补全来设置下,同时作为自己配置的记录文档.……………………………………………… ...