C. Code a Trie(Trie+dfs+贪心)

C. Code a Trie

大佬题解,代码基本就是抄的

对于每一个值计算所有串的LCA,也就是最长公共前缀,将该节点(Trie树的节点)标记,对于这些字符串在LCA下面的点一定不存在(如果存在他们不会返回相同的值)

每个Trie树中的节点只能被标记一次,并且从跟到LCA路径上的变必须存在

dfs贪心计算每个子树中最少的节点
插入时统计cnt[u]表示它的子树中被标记为LCA的点的数量

  • 如果cnt[u]>1,这个点必选,如果说该节点没被标记为LCA,那么它可以替代它一个儿子称为那个值的LCA,如果被标记为LCA,它的儿子被标记那就必须选。
  • 如果cnt[u]=1,贪心选择该点,儿子不选
  • 如果cnt[u]=0,贪心不选
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=500010;int n,a[N],b[N],cnt[N],ans;
string s[N];
vector<string> g[N];
int t[N][27],idx;
bool lca[N];
void init()
{cin>>n;int m=0;for(int i=1;i<=n;i++) {cin>>s[i]>>a[i];m+=s[i].size();}idx=0;for(int i=1;i<=n;i++) g[i].clear();for(int i=0;i<=m;i++) memset(t[i],0,sizeof t[i]);for(int i=0;i<=m;i++) lca[i]=0,cnt[i]=0;
}bool check(vector<string> &v) {//暴力寻找LCAsort(v.begin(),v.end(),[&](string a, string b) {return a.size()<b.size();});int len=0;for(int i=0;i<v[0].size();i++) {int ok=1;for(int j=0;j<v.size()&&ok;j++)if(v[j][i]!=v[0][i]) ok=0;if(ok) len++;else break;}// Trie树插入int p=0;for(int i=0;i<len;i++) {cnt[p]++;//子树中的lcaint c=v[0][i]-'a';if(t[p][c]==-1) return 0; //节点不存在if(!t[p][c]) t[p][c]=++idx;p=t[p][c];} if(lca[p]) return 0;lca[p]=1;cnt[p]++;// lca 后面的一定不存在 打上标记for(int i=0;i<v.size();i++) {if(v[i].size()<=len) continue; int c=v[i][len]-'a';if(t[p][c]>0) return 0;// 不存在的点存在了t[p][c]=-1;}return 1;
}
void dfs(int u) {if(cnt[u]>1) ans++;bool fl=lca[u]==0;for(int i=0;i<26;i++) {int v=t[u][i];if(!v||v==-1) continue;if(cnt[v]==1) {if(!fl) ans++;else fl=0;}else dfs(v);}
}
void co(int cid, int x) {cout << "Case #" << cid << ": " << x<<'\n';
}
void work(int cid) {int m=0;for(int i=1;i<=n;i++)b[++m]=a[i];// 离散化sort(b+1,b+1+m);m=unique(b+1,b+1+m)-b-1;for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+m,a[i])-b;// 统计相同值的字符串for(int i=1;i<=n;i++) g[a[i]].push_back(s[i]);// 判断进行插入for(int i=1;i<=m;i++)if(!check(g[i])) {co(cid, -1);return;}ans=0;cnt[0]++; //根节点必须选dfs(0);co(cid, ans);
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T=1;cin>>T;for(int i=1;i<=T;i++) {init();work(i);}return 0;
}

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

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

相关文章

swagger文档转换为WebApiClient声明式代码

1 swagger简介Swagger是一个规范且完整的框架&#xff0c;提供描述、生产、消费和可视化RESTful Web Service。其核心是使用json来规范描述RESTful接口&#xff0c;另外有提供UI来查看接口说明&#xff0c;并有一套生成不同语言的客户端调用代码生成器。1.1 对Api提供者自顶向下…

Musical Theme pku1743 (后缀数组)

Musical Theme(后缀数组) 题意&#xff1a; n个数&#xff0c;选取一段子序列&#xff0c;满足以下条件&#xff1a; 1.长度至少为5 2.在数列中其他位置出现过(允许转置) 3.与其他位置出现的不重叠 转置&#xff1a;将恒定的正或负值添加到子序列上 例如&#xff1a; n个数为…

各种有用的东西留言板

目录各种链接各种OJ各种有用网站模拟赛排名表格制作其他STLO2优化&#xff1a;快读fread黑科技各种链接 各种OJ ssl 洛谷 纪中 牛客 PTA Vijos JoyOI 51Nod 大视野 ssl比赛 NOI.AC AcWing USACO CodeVS 北京大学 浙江大学 Comet OJ 杭州电子科技大学 《算法竞赛进阶指南》题库…

P3180-[HAOI2016]地图【圆方树,莫队,分块】

正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 nnn个点mmm条边的一个仙人掌&#xff0c;有点权。 QQQ次询问给出op,x,yop,x,yop,x,y&#xff0c;封闭111到xxx号点的所有简单路径后xxx能到达的点的点权中&#xff0c;小于yyy且出现次数为奇数/偶数的权值数目…

M. Monster Hunter(树形dp)

M. Monster Hunter 才知道原来树形dp是三维的&#xff0c;一直没有学会过&#xff0c;感谢大佬的文章&#xff01;算法进阶—理解树形背包问题 状态表示&#xff1a;fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}​以iii为根的子树&#xff0c;考虑到第kkk个儿子时&#xff0c;…

Another Blog

说明&#xff1a; 此博客用于平时做题 但为了整理知识&#xff0c;用博客园来存知识 博客园网址&#xff1a; https://www.cnblogs.com/ssllyf

KubeCon+CloudNativeCon首秀中国!

2018年11月13-15日&#xff0c;全球顶级的Kubernetes官方技术论坛KubeConCloudNativeCon将首次登陆中国&#xff0c;此次活动由云原生计算基金会&#xff08;CNCF&#xff09;主办&#xff0c;在上海跨国采购会展中心隆重举行。KubeCon CloudNativeConKubeConCloudNativeCon 是…

可持久化(一)

参考博客 可持久化数据结构&#xff1a;可以保留每一个历史版本&#xff0c;若所有版本都既可以访问又可以修改&#xff0c;成为完全可持久化&#xff08;可以回滚到某个历史版本&#xff09; 时间线&#xff1a; 可持久化线段树 可持久化下标线段树 题目&#xff1a; 模板…

【模板】高斯消元

ACM模板 目录高斯消元解线性方程组异或方程组bitset优化异或方程组高斯消元解线性方程组 int a[N][N]输入矩阵&#xff0c;nnn行&#xff0c;n1n1n1列&#xff0c;下标从0开始 第n1n1n1列表示方程右边的值&#xff08;n行即n个方程&#xff0c;n列即n个未知数&#xff09; int…

各种模板(数据结构图论)

文章目录数据结构LCT线段树线段树分治树状数组图论Tarjan静态仙人掌最小生成树最短路-Floyd最短路-Dijkstra最短路-Bellman-Ford最短路-SPFA数据结构 LCT #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll lo…

P6620-[省选联考2020A卷]组合数问题【组合数学,斯特林数】

正题 题目链接:https://www.luogu.com.cn/problem/P6620 题目大意 给出n,x,p,mn,x,p,mn,x,p,m和一个mmm次多项式fff求 ∑k0nf(k)xk(nk)\sum_{k0}^nf(k)\times x^k\times \binom{n}{k}k0∑n​f(k)xk(kn​) 答案对ppp取模。 1≤n≤109,1≤m≤10001\leq n\leq 10^9,1\leq m\leq …

ASP.NET Core中使用GraphQL - 第一章 Hello World

前言你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中&#xff0c;我将展示如何在ASP.NET Core中集成GraphQL, 并使用GraphQL作为你的API查询语言。…

L2-005 集合相似度 (25分)

L2-005 集合相似度 (25分) 给定两个整数集合&#xff0c;它们的相似度定义为&#xff1a;N​c/N​t​​ 100%。其中N​c 是两个集合都有的不相等整数的个数&#xff0c;N​t是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式&#xf…

【模板】EK求最大流、dinic求最大流

ACM模板 目录概念EK算法Dinic算法概念 yxc老师的部分总结 基本概念 1.1 流网络&#xff0c;不考虑反向边 1.2 可行流&#xff0c;不考虑反向边 1.2.1 两个条件&#xff1a;容量限制、流量守恒 1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量 1.2.3 最大流是指最大可行…

11月7日邀您参加成都微软MVP圆桌之夜!

阅读文本大概需要 3.3 分钟。活动背景/规模成都一座来了就不想离开的城市&#xff0c;在此秋高气爽的日子里&#xff0c;我们迎来了成都微软最有价值专家&#xff08;MVP&#xff09;圆桌之夜。在过去的一年中&#xff0c;感谢各位MVP以杰出的专业知识在技术社区中解决了大量的…

L2-006 树的遍历

给定一棵二叉树的后序遍历和中序遍历&#xff0c;请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤30&#xff09;&#xff0c;是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中…

各种模板(数学数论字符串)

文章目录数学&数论线性求逆元exgcdexcrtFFTNTT矩阵乘法线性筛素数杜教筛字符串TrieKMPhashManacherAC自动机PAMSAM广义SAM数学&数论 线性求逆元 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll lon…

学习手记(2021/3/19~2022/8/25)

上一篇有点多就开新的了 文章目录树哈希wqswqswqs二分单位根反演威佐夫博弈范德蒙德行列式BEST定理平面图欧拉定理FWT转移矩阵的推导保序回归二分图最大团一些数学小结论范德蒙德卷积乘转加卷积斐波那契前缀和杜教筛μ\muμ单幂转下降幂下降幂X组合数多项式gcd无逆元求行列式&a…

【模板】最大流之上下界可行流

ACM模板 目录无源汇上下界可行流有源汇上下界最大流有源汇上下界最小流无源汇上下界可行流 问题&#xff1a; 给定一个网络&#xff0c;求一个流满足&#xff1a;每条边的流量处在给定的下界和上届[lower,upper]之间&#xff0c;满足流量守恒 首先我们在原网络中确定一个全部是…

Sangmado 公共基础类库

Sangmado&#xff08;发音 /sɔŋmɑːdu:/ ‘桑麻渡’&#xff09;涵盖了支撑 .NET/C# 项目开发的最基础的公共类库&#xff0c;为团队在不断的系统开发和演进过程中发现和积累的最公共的代码可复用单元。Sangmado 公共类库设计原则&#xff1a;独立性&#xff1a;不与任何业务…