CF590E-Birthday【AC自动机,最大独立集】

正题

题目链接:https://www.luogu.com.cn/problem/CF590E


题目大意

nnn个字符串,求一个最大的集合使其中没有任何串是其他集合内字符串的子串


解题思路

先用ACACAC自动机建立好failfailfail树+传递闭包就可以确定好两两之间的子串关系了,之后用网络流最大匹配求最大独立集即可


codecodecode

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e7+10,M=1600,inf=2147483647/3;
struct node{int to,next,w;
}a[1010000];
int n,tot=1,cnt,s,t;
int ch[N][2],fail[N],fa[N],cur[M];
int ls[M],ed[N],pos[N],dep[M];
bool d[M][M];char st[N];
queue<int> q;
void Make(char *s,int num){int x=1,len=strlen(s);for(int i=0;i<len;i++){int w=s[i]-'a';if(!ch[x][w])ch[x][w]=++cnt,fa[cnt]=x;x=ch[x][w];}ed[x]=num;pos[num]=x; return;
}
void Bfs(){ch[0][0]=ch[0][1]=1;q.push(1);fail[1]=0;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<2;i++)if(!ch[x][i])ch[x][i]=ch[fail[x]][i]; else{q.push(ch[x][i]);int y=fail[x];fail[ch[x][i]]=ch[y][i]; }}return;
}
void addl(int x,int y,int w)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
bool bfs()
{memset(dep,0,sizeof(dep));memcpy(cur,ls,sizeof(cur));while(!q.empty()) q.pop();q.push(s);dep[s]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!dep[y]&&a[i].w){dep[y]=dep[x]+1;q.push(y);}}}if(dep[t]) return true;return false;
}
int dinic(int x,int flow)
{int rest=0,k;if(x==t||!flow) return flow;for(int i=cur[x];i;i=a[i].next){int y=a[i].to;cur[x]=i;if(dep[x]+1==dep[y]&&a[i].w){rest+=(k=dinic(y,min(a[i].w,flow-rest)));a[i].w-=k;a[i^1].w+=k;if(rest==flow) return flow;}}if(!rest) dep[x]=0;return rest;
}
int main()
{scanf("%d",&n);cnt=1;for(int i=1;i<=n;i++){scanf("%s",st);Make(st,i);}Bfs();ed[1]=-1;for(int i=1;i<=n;i++){for(int j=pos[i];j!=1;j=fa[j]){int x=fail[j];while(!ed[x])x=fail[x];int y=fail[j];while(!ed[y]){int w=fail[y];fail[y]=x;y=w;}fail[j]=x;if(j!=pos[i]&&ed[j])d[i][ed[j]]=1;if(x!=1)d[i][ed[x]]=1;}}for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)d[i][j]|=d[i][k]&d[k][j];s=0;t=2*n+1;for(int i=1;i<=n;i++)addl(s,i,1),addl(i+n,t,1);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j&&d[i][j])addl(i,j+n,1);int ans=n;while(bfs())ans-=dinic(s,inf);printf("%d\n",ans);for(int i=1;i<=n;i++)if(dep[i]&&!dep[i+n])printf("%d ",i);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最短路】【SPFA】电车 (luogu 1346)

电车 luogu 1346 题目大意&#xff1a; 有n个点&#xff0c;要从一个点到另一个点&#xff0c;每个点连接着其他ai个点&#xff0c;到连接的第一个点路径长度为0&#xff0c;其他长度为1&#xff0c;求最短路 题目描述 在一个神奇的小镇上有着一个特别的电车网络&#xff…

网络流及建模专题(下)

前言 不断更新中… 专题的(下)篇将介绍网络流的一些奇奇怪怪的应用和费用流有关的一些套路。 本专题暂时包含三道题&#xff1a; 洛谷P1251 餐巾计划问题: 费用流的基本应用 Trade Gym - 100212I: 使用网络流对图论中的边进行调整 codeforces 818G - Four Melodies: 费用…

CentOS 7.4 下 如何部署 AspNetCore 结合 consul

上篇我们讲到consul的概念&#xff0c;以及在WIN下如何使用&#xff1a; 在Windows 下如何使用 AspNetCore Api 和 consul步骤如下&#xff1a;1、安装虚拟机VM 2、下载安装 CentOS 7.4&#xff08;地址就不提供了&#xff09;这是安装示例&#xff1a; VM虚拟机安装CentOS 示例…

P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P4083 题目大意 开始时AAA和BBB各有两个礼物&#xff0c;每个礼物对两个人有不同的价值&#xff0c;开始时AAA会送BBB一个礼物。 对于一个收到礼物的人&#xff0c;如果该礼物对他来说价值为valvalval&#xff0c;那么他会回…

【SPFA】最优贸易(luogu 1073)

最优贸易 luogu 1073 题目大意&#xff1a; 有n个城市和m条线路连接着这些城市&#xff08;当编号为1时是有向&#xff0c;2时是无向&#xff09;&#xff0c;从1城市出发到n城市&#xff0c;每个城市都有固定的水晶球价格&#xff08;进价和售价一样&#xff09;&#xff0…

Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)

Demo路径&#xff1a;https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目&#xff0c;属于新特性之一&#xff0c;用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来&#xff0c;封装…

Problem H Rock Paper Scissors,FFT

题目 题目链接 题意 给出两段石头剪刀布的顺序SS和T" role="presentation" style="position: relative;">TT&#xff0c;其中TT要短一些,现在让你把T" role="presentation" style="position: relative;">TT往SS的…

CF1066F-Yet another 2D Walking【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1066F 题目大意 平面上有nnn个点&#xff0c;每个点在max(x,y)max(x,y)max(x,y)层&#xff0c;走第kkk层的点之前一定要先走前面层的点&#xff0c;求走完所有点的最短路。 解题思路 对于每一层来说&#xff0c;我们可以将…

【最短路】【SPFA】城市问题(ssl 1761)

城市问题 ssl 1761 题目大意&#xff1a; 求一个点到其它点的最短路 原题&#xff1a; Description 设有n个城市&#xff0c;依次编号为0&#xff0c;1&#xff0c;2&#xff0c;……&#xff0c;n-1&#xff08;n<100&#xff09;&#xff0c;另外有一个文件保存n个城…

.NET Core微服务之基于Ocelot实现API网关服务

一、啥是API网关&#xff1f;API 网关一般放到微服务的最前端&#xff0c;并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。以前的话&#xff0c;客户端不得不去请求微服务A&#xff08;假设为Customers&am…

P3157 动态逆序对 ,树状数组套动态开点线段树

题目 洛谷题目链接 题解 在求整体的逆序对的数量时&#xff0c;很好办&#xff0c;直接用树状数组处理即可&#xff0c;不过在这时&#xff0c;我们还需要处理出一个数组pa[]pa[]pa[]&#xff0c;其中pa[i]pa[i]pa[i]代表在区间[1,i)[1,i)[1,i)中满足aj>aia_j>a_iaj​…

【DP】猫咪的进化

猫咪的进化 题目大意&#xff1a; 有n个实数&#xff0c;每一个实数可以选&#xff0c;可以不选&#xff0c;也可以选择它的平方&#xff0c;但如果选择了它的平方&#xff0c;就不能选择下一个数或下一个数的平方&#xff0c;求选出来的数的和最大是多少 原题&#xff1a; …

[8.21NOIP模拟赛]决战【tarjan】

正题 题目大意 nnn个点mmm条边的联通图&#xff0c;去掉一个点使得其变为一棵树 求能去掉哪些点 解题思路 首先去掉后就是一棵n−1n-1n−1个节点的树&#xff0c;也就是有n−2n-2n−2条边&#xff0c;这样我们就需要去掉m−n2m-n2m−n2条边&#xff0c;也就是去掉入度为m−n2…

[译]RabbitMQ教程C#版 - 发布订阅

先决条件本教程假定RabbitMQ已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表联系我们。1.发布/订阅…

P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案

题目 洛谷题目链接 题解 题目的数据范围非常奇怪&#xff0c;一半是200∗200200∗200的矩阵&#xff0c;另一半是1∗500001∗50000的矩阵&#xff0c;显然是一道二合一的题目&#xff0c;但是不一样的地方也就在与数据结构的选择不一样&#xff0c;而我们解这道题使用的算法…

nssl1511-我的世界【堆,贪心】

正题 题目大意 nnn个点的一棵树&#xff0c;给每一个点一个权值&#xff0c;每个点的依靠点是与它相连的权值最小的点&#xff0c;要求每个点最多只有一个依赖点。 求字典序最小的方案 解题思路 首先最小的一定是叶子结点&#xff0c;然后他的父节点指向他&#xff0c;因为它…

【SPFA】【最短路/次短路】GF打Dota

GF打Dota 题目大意&#xff1a; 求一个点到另一个点的最短路或次短路 原题&#xff1a; 题目描述 众所周知&#xff0c;GF同学喜欢打dota&#xff0c;而且打得非常好。今天GF和Spartan同学进行了一场大战。现在GF拿到一张地图&#xff0c;地图上一共有n个地点&#xff0c;…

用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里&#xff1a;用ASP.NET Core …

2017 SEERC Divide and Conquer 树上差分

题目 题目大意&#xff1a;给出两颗树的复合图(即这张图是由两颗树拼起来的)&#xff0c;询问最小割掉多少条边&#xff0c;可以使得图不联通&#xff0c;并输出方案数。 分析 我觉得这是一道很难的题目&#xff0c;因为比较难想&#xff0c;前提结论比较多。 首先我们需要…

P2414-[NOI2011]阿狸的打字机【AC自动机,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P2414 题目大意 一个子串表示操作有 往凹槽里打一个字母删除最后一个字母将凹槽中的字母打印到一个新的行里&#xff08;原来的不会消失&#xff09; 然后每次询问两个数字(x,y)(x,y)(x,y)表示询问第xxx行的字串在第yyy行的…