Codeforces 1213F Unstable String Sort
中文题意
求一个由最多26个、最少k个小写字母构成的,长度为n的字符串,这个字符串要满足的要求是——当其中字母按照p和q两个\(1\)~\(n\)的全排列重新排序时,新的字符串是按照升序排好序的(没要求老字符串排好序)。
解题思路
虚拟赛时其实已经走到了想出正解的路上我在路上了。正解是这样——对于排列p,将所有p[i]到p[i+1]连边,对于q也将所有q[i]和q[i+1]连边,那么每条边就代表前面位置的字母要小于等于后面位置的字母,那对于这个图中的的所有强连通分量,上边的字母应该都是相同的。于是缩点产生一个DAG,这个DAG前面的字母小于等于后面的字母,于是BFS一遍删点,删点的时候给该点赋一个字母,然后字母加一。最后输出答案就好。
虚拟赛时想到的是把p和q扫一遍,然后对于p和q中的一个位置上的不同数字,那么这两个数字代表的新位置之间的字母应该相同,但是这两个位置之间的其他数字也产生了其他一对对位置,然后复杂度就上去了……乱七八糟的各种没想清楚。
源代码
#include<queue>
#include<cstdio>
#include<algorithm>
const int MAXN=2e5+5;
int n,k;
struct Edge{
int nxt,to;
}e[MAXN<<2],e2[MAXN<<2];
int head[MAXN],cnt=1,head2[MAXN],cnt2=1;
inline void add(int u,int v)
{
e[cnt]={head[u],v};
head[u]=cnt++;
}
inline void add2(int u,int v)
{
e2[cnt2]={head2[u],v};
head2[u]=cnt2++;
}
int num=0,id[MAXN];//强连通分量数量
int ru[MAXN];//强连通分量的入度
int ind=1,dfn[MAXN],low[MAXN];
int stack[MAXN],top=0;
bool instack[MAXN];
void dfs(int u)
{
dfn[u]=low[u]=ind++;
stack[top++]=u;
instack[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(!dfn[v])
{
dfs(v);
low[u]=std::min(low[u],low[v]);
}
else if(instack[v]) low[u]=std::min(low[v],low[u]);
}
if(dfn[u]==low[u])
{
int v;
num++;
do{
v=stack[--top];
instack[v]=0;
id[v]=num;
}while(u!=v);
}
}
char ans[MAXN];
void bfs()
{
std::queue<int> q;
for(int u=1;u<=num;u++) if(!ru[u]) q.push(u);
char x='a';
while(!q.empty())
{
int u=q.front();
ans[u]=x;
if(x!='z') x++;
q.pop();
for(int i=head2[u];i;i=e2[i].nxt)
{
int v=e2[i].to;
ru[v]--;
if(!ru[v]) q.push(v);
}
}
}
int main()
{
// freopen("test.in","r",stdin);
scanf("%d%d",&n,&k);
for(int x=0;x<2;x++)
{
int temp;
scanf("%d",&temp);
for(int i=1,j;i<n;i++)
{
scanf("%d",&j);
add(temp,j);
temp=j;
}
scanf("%d",&temp);
for(int i=1,j;i<n;i++)
{
scanf("%d",&j);
add(temp,j);
temp=j;
}
}
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);//6>5>4>3>2>1
if(num<k)
{
puts("NO");
return 0;
}
for(int u=1;u<=n;u++)
{
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(id[u]!=id[v]) add2(id[u],id[v]),ru[id[v]]++;
}
}
puts("YES");
bfs();
for(int i=1;i<=n;i++)
{
putchar(ans[id[i]]);
}
return 0;
}
Codeforces 1213F Unstable String Sort的更多相关文章
- Codeforces Round #582 (Div. 3) F. Unstable String Sort
传送门 题意: 你需要输出一个长度为n的字符序列(由小写字母组成),且这个字符串中至少包含k个不同的字符.另外题目还有要求:给你两个长度为p和q的序列,设字符序列存在s中 那么就会有s[Pi]< ...
- CF1213F Unstable String Sort(差分)
其实全部可以为同一种字符串,但题目要求\(k\)种,我们考虑开始尽可能不同,最后再取\(min\) 考虑\(A\),全部不同:再做\(B\),\(S[b_{i-1}]\le S[b_{i}]\)如果开 ...
- CF1213F Unstable String Sort
题目链接 问题分析 题目实际上是一堆大于等于的约束.观察这\(2n-2\)个约束.第一组可以将要求的排成一个不降的序列,然后第二组就是在第一组的基础上再添加条件. 不妨设第一组生成的不降序列是\(\{ ...
- codeforces1213F Unstable String Sort 思维
题目传送门 题意:a和b都代表字符串的下标,至少用k个字符,构造一个长度为n的字符串,将这个字符串中的字符按无论是按$a$写还是按$b$写,字典序都非递减. 思路:如果将$a[l,r]=b[l,r]$ ...
- 830. String Sort
830. String Sort 题解 int alpha[256] = {0};//记录字符的次数 bool cmp(char a,char b) { if(alpha[a]==alpha[b])/ ...
- Codeforces 1197 E (dp+sort+二分) (Rust)
原题链接 2300分 大意 俄罗斯套娃,每个有内容半径in和外围半径out in_i<out_i 如果 in_i >= out_j ,那么j可以放在i内 定义残留空间 = 一列嵌套的套娃 ...
- CodeForces 797C Minimal string:贪心+模拟
题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...
- Codeforces 827E Rusty String - 快速傅里叶变换 - 暴力
Grigory loves strings. Recently he found a metal strip on a loft. The strip had length n and consist ...
- Codeforces 797C - Minimal string
C. Minimal string 题目链接:http://codeforces.com/problemset/problem/797/C time limit per test 1 second m ...
随机推荐
- Codeforces 1178B. WOW Factor
传送门 显然对每个 $o$ ,考虑左边和右边分别有多少 $w$,那么这个 $o$ 的贡献就是左右 $w$ 的出现次数相乘 $w$ 的出现次数可以直接根据每一段连续的 $v$ 得到 那么从左到右扫一遍, ...
- redis 学习(8)-- redis 客户端 -- Jedis
redis 客户端 -- Jedis 1. Jedis 直连 本质是 TCP 连接. 执行流程 创建Jedis对象 通过Jedis执行命令 返回Jedis执行结果 关闭Jedis连接 demo 要使用 ...
- EBS自动行号,行金额自动汇总到头,金额根据币种编号总结
一.自动行号实现 1.方法一: 只需要将“序号”定义成公式,并将公式设置为:get_block_property('block_name',current_record)就可以实现了,或者把这行语句放 ...
- python爬虫简介
一.什么是网络爬虫? 网络爬虫,是一种按照一定规则,自动的抓取万维网信息的程序或者脚本. 二.python网络爬虫, 需要用到的第三方包 requests和BeautifulSoup4 pip ins ...
- ListVie的用法
1.在布局中放入一个listView <ListView android:id="@+id/list_view" android:layout_width="mat ...
- 数据绑定-@ CookieValue
测试:
- bzoj 3837 pa2013 Filary
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...
- sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1091, "Can't DROP 'users_ibfk_1'; check that column/key exists") [SQL: ALTER TABLE users DROP FOREIGN KEY users_ibfk_1]
flask 迁移数据库报错 报错: sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1091, "Can't DROP ...
- 在 React 组件中使用 Refs 指南
原文:Fullstack React's Guide to using Refs in React Components作者:Yomi Eluwande译者:博轩 译文:https://segment ...
- ubuntu - 如何以root身份使用图形界面管理文件?
nautilus 是gnome的文件管理器,但是如果不是root账号下,权限受限,我们可以通过以下方式以root权限使用! 一,快捷键“ctrl+alt+t”,调出shell. 二,在shell中输入 ...