是毒瘤的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. 解决IIS设置多个工作进程中Session失效的问题

    利用StateServer实现Session共享 session保存在专门的StateServer中,该种方式,性能损失比sql略好.比inproc据说有10%-15%的性能损失.怎么使用StateS ...

  2. 编写clearedit的安卓控件

    1.写一个自定义的控件 public class ClearEditText extends AppCompatEditText implements View.OnFocusChangeListen ...

  3. codeforces803D. Magazine Ad

    D. Magazine Adtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutput ...

  4. 初识 spl_autoload_register

    spl_autoload_register 一.首先我们看来自官网的定义 版本要求:php版本为5.1.2+ 说明:注册给定的函数作为__autoload的实现.即自动加载 函数参数说明: bool ...

  5. springboot部署多个vue项目

    在springboot下部署多个vue项目,只需要将vue打包成静态文件后,将其放在resources的静态文件夹下即可. 如下图:static目录下有三个vue的静态文件夹,分别为运营后台(admi ...

  6. 51nod1031(简单斐波拉契数列)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1031 题意:中文题诶- 思路:对于第x块骨牌的情况,我们用a ...

  7. 【BZOJ1468】Tree [点分治]

    Tree Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距 ...

  8. 【STSRM12】夏令营

    [题意]n个数划分成k段,每段的价值为段内不同数字的数量,求最大总价值 [算法]DP+线段树 [题解] f[i][j]表示前i个数字划分成j段的最大价值. f[i][j]=max(f[k][j-1]+ ...

  9. 数据安全之MD5、SHA-1、CRC32区别

    crc32 — 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式……:这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式 ...

  10. C/C++里的const(2)

    对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢? const int a; int const a; const int *a; int *const a; int ...