贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问。他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色。为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 10^5105 的字符串。现在魔法师想要通过一系列魔法使得这两个字符串相同。每种魔法形如 (u,\ v),\ u,\ v \le 10^5(u, v), u, v≤105,可以将一个字符 uu改成一个字符 vv,并且可以使用无限次。出于种种原因,魔法师会强行指定这两个串能否进行修改。

若失败输出 -1−1,否则输出最少使用的魔法的种类数。

输入格式

一个正整数 n(n \le 10^5)n(n≤105) 表示每个字符串的长度。

接下来两行每行首先输入一个单词("Variable""Constant"),"Variable"表示这个字符串能进行修改,"Constant"表示这个字符串不能进行修改,然后 nn 个正整数表示一个字符集不大于 10^5105 的字符串。

输出格式

若有解,输出一个自然数表示最少使用的魔法的种类数。否则输出 -1−1。

保证所有输入的数字都为正整数且不大于 10^5105。

样例输入1

2
Constant 111 222
Variable 222 111

样例输出1

2

样例输入2

2
Variable 111 222
Variable 222 111

样例输出2

1

题目来源

2018 计蒜之道 复赛


不说了 SB错误能卡我好久。

对于cc的情况判字符串是不是相等。

对于vv的情况并查集找联通块数,次数就是总点数减去联通块数。

对于cv的情况我们仍旧双向存联通块。对于内部有自环的我们建的边数等于块内点数。对于没有自环的,我们建的边数等于块内点数-1。

第二种情况跟vv的是类似的,第一种情况则是把所有点建成一个大的自环,这样所有点都互相可达了。

 #include<bits/stdc++.h>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define INF 0x3f3f3f3f
#define LL long long
#define pb push_back
#define mod 1000000007
#define ls(i) (i<<1)
#define rs(i) (i<<1|1)
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=1e5+;
const int P=1e5;
int inf[];
int s[][N];
vector<int> e[N];
bool vis[N],ins[N];
bool ct[N];
int fa[N];
bool exist[N];
int now,ans;
char is[];
bool dfs(int u)
{
ins[u]=;
vis[u]=;
int flag=;
for(auto p:e[u])
{
if(ins[p])
{
flag=;
continue;
}
if(vis[p])
continue;
if(dfs(p)) flag=;
}
ins[u]=;
return flag;
}
int Find(int x) {return fa[x]==x?x: fa[x]=Find(fa[x]);}
void Union(int u,int v)
{
int x=Find(u),y=Find(v);
if(x!=y)
fa[x]=y;
return ;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<;i++)
{
scanf("%s",is);
if(strcmp(is,"Constant")==)
inf[i]=;
else
inf[i]=;
for(int j=;j<=n;j++)
scanf("%d",&s[i][j]);
}
if(inf[]==)
now=;
else
now=;
int pt=inf[]+inf[];
for(int i=;i<=P;i++)
fa[i]=i;
for(int i=;i<=n;i++)
{
if(pt>= && s[now][i]!=s[now^][i])
e[s[now][i]].pb(s[now^][i]),Union(s[now][i],s[now^][i]);
exist[s[now][i]]=;
exist[s[now^][i]]=;
}
ans=;
for(int i=;i<=P;i++)
{
if(e[i].size()>)
{
sort(e[i].begin(),e[i].end());
e[i].resize(unique(e[i].begin(),e[i].end())-e[i].begin());
}
if(exist[i]) ans++;
}
if(pt==)
{
bool flag=;
for(int i=;i<=n;i++)
if(s[][i]!=s[][i])
flag=;
if(flag)
printf("-1\n");
else
printf("0\n");
}
if(pt==)
{
for(int i=;i<=P;i++)
if(exist[i] && !vis[i])
if(dfs(i)) ct[Find(i)]=;
for(int i=;i<=P;i++)
if(exist[i] && fa[i]==i && ct[i]==)
ans--;
printf("%d\n",ans);
}
if(pt==)
{
for(int i=;i<=P;i++)
if(exist[i] && fa[i]==i)
ans--;
printf("%d\n",ans);
}
return ;
}

2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)的更多相关文章

  1. 贝壳找房魔法师顾问[并查集+DAG判断]

    题目链接[https://nanti.jisuanke.com/t/27647] //计蒜客2018复赛D题,想简单了. 题解: 题目是中文的,不再赘述. 题解: 分为三种情况:1.两个字符串都不能变 ...

  2. 2018 计蒜之道 初赛 第五场 A 贝壳找房搬家

    贝壳找房换了一个全新的办公室,每位员工的物品都已经通过搬家公司打包成了箱子,搬进了新的办公室了,所有的箱子堆放在一间屋子里(这里所有的箱子都是相同的正方体),我们可以把这堆箱子看成一个 x*y*z 的 ...

  3. 2016计蒜之道复赛 百度地图的实时路况(Floyd 分治)

    题意 题目链接 Sol 首先一个结论:floyd算法的正确性与最外层\(k\)的顺序无关(只要保证是排列即可) 我大概想到一种证明方式就是把最短路树上的链拿出来,不论怎样枚举都会合并其中的两段,所以正 ...

  4. 2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)

    为了给全球小学员打起信息安全"保护伞",VIPKID 还建立了一套立体化的安全防御体系,7 \times 247×24 小时持续安全监控与应急响应等多项联动,具备业界最高级别的数据 ...

  5. 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治

    链接:https://nanti.jisuanke.com/t/11217 奉上官方题解: 枚举 d(x , y , z) 中的 y,把 y 从这个图中删去,再求这时的全源最短路即可,使用 Floyd ...

  6. 2016计蒜之道复赛 菜鸟物流的运输网络 网络流EK

    题源:https://nanti.jisuanke.com/t/11215 分析:这题是一个比较经典的网络流模型.把中间节点当做源,两端节点当做汇,对节点进行拆点,做一个流量为 22 的流即可. 吐槽 ...

  7. 2016计蒜之道复赛B题:联想专卖店促销

    题解 思路: 二分答案,设我们要check的值为x. 注意到每一个礼包都有,一个U盘,一个鼠标. 剩余的,分别为一个机械键盘,一个U盘,一个鼠标. 当礼包数目为x时,我们至多可以提供a-x个普通,b- ...

  8. 2018 计蒜之道-初赛 第一场 A-百度无人车

    百度一共制造了 nn 辆无人车,其中第 ii 辆车的重量为 a_i\ \mathrm{kg}ai​ kg. 由于车辆过重会增大轮胎的磨损程度,现在要给这 nn 辆车减轻重量.每将一辆车减轻 1\ \m ...

  9. 2019 计蒜之道 复赛 B. 个性化评测系统 (模拟,实现,暴搜)

    24.02% 1000ms 262144K "因材施教"的教育方式自古有之,互联网时代,要实现真正意义上的个性化教育,离不开大数据技术的扶持.VIPKID 英语 2020 多万学员 ...

随机推荐

  1. SolrJ案例实现搭建环境——(十五)

    案例

  2. python学习之argparse模块的使用

    以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...

  3. 使用postman做接口测试(二)

    参考大神总结:https://www.cnblogs.com/Skyyj/p/6856728.html 二,下边的东西工作中实际要用到了 1, postman安装 chrome浏览器打开chrome: ...

  4. C++如何判断大小端

    http://bbs.chinaunix.net/thread-1257205-1-1.html #include <stdio.h>#include <string.h>#i ...

  5. Git如何设置多个用户

    前言 由于我们在使用GitHub时,通常不希望带有公司信息,所以需要独立的Git账户来提交练习代码,本文记录一下如何配置多个Git账户并创建公钥 正文 1.首先进入~/.ssh文件夹 2.然后创建一个 ...

  6. 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)

    Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...

  7. Shell编程学习1--基础了解

    "#!path"告诉系统path所指的程序为用来解释此脚本文件的Shell程序: 如#!/bin/sh, #!/bin/bash Shell Script的后缀名为.sh; ech ...

  8. linux 命令之cut

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [file] 或 cut ...

  9. java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)

    本文知识点(目录): 1.Number对象    2.Math对象    3.String对象    4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...

  10. invalid byte sequence for encoding "UTF8": 0xe99d2c

    服务器还原数据库数据出错,老规矩... 字符集编码的问题 http://blog.csdn.net/beiigang/article/details/39582583 over....