cf题面

中文题意

求一个由最多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的更多相关文章

  1. Codeforces Round #582 (Div. 3) F. Unstable String Sort

    传送门 题意: 你需要输出一个长度为n的字符序列(由小写字母组成),且这个字符串中至少包含k个不同的字符.另外题目还有要求:给你两个长度为p和q的序列,设字符序列存在s中 那么就会有s[Pi]< ...

  2. CF1213F Unstable String Sort(差分)

    其实全部可以为同一种字符串,但题目要求\(k\)种,我们考虑开始尽可能不同,最后再取\(min\) 考虑\(A\),全部不同:再做\(B\),\(S[b_{i-1}]\le S[b_{i}]\)如果开 ...

  3. CF1213F Unstable String Sort

    题目链接 问题分析 题目实际上是一堆大于等于的约束.观察这\(2n-2\)个约束.第一组可以将要求的排成一个不降的序列,然后第二组就是在第一组的基础上再添加条件. 不妨设第一组生成的不降序列是\(\{ ...

  4. codeforces1213F Unstable String Sort 思维

    题目传送门 题意:a和b都代表字符串的下标,至少用k个字符,构造一个长度为n的字符串,将这个字符串中的字符按无论是按$a$写还是按$b$写,字典序都非递减. 思路:如果将$a[l,r]=b[l,r]$ ...

  5. 830. String Sort

    830. String Sort 题解 int alpha[256] = {0};//记录字符的次数 bool cmp(char a,char b) { if(alpha[a]==alpha[b])/ ...

  6. Codeforces 1197 E (dp+sort+二分) (Rust)

    原题链接 2300分 大意 俄罗斯套娃,每个有内容半径in和外围半径out in_i<out_i 如果 in_i >= out_j ,那么j可以放在i内 定义残留空间 = 一列嵌套的套娃 ...

  7. CodeForces 797C Minimal string:贪心+模拟

    题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...

  8. Codeforces 827E Rusty String - 快速傅里叶变换 - 暴力

    Grigory loves strings. Recently he found a metal strip on a loft. The strip had length n and consist ...

  9. Codeforces 797C - Minimal string

    C. Minimal string 题目链接:http://codeforces.com/problemset/problem/797/C time limit per test 1 second m ...

随机推荐

  1. ABC134F Permutation Oddness

    Problem Statement Let us define the oddness of a permutation $p = \{p_1, p_2, \dots, p_n\}$ of $\{1, ...

  2. 什么是PWA

    什么是PWA:https://www.jianshu.com/p/299c9c720e56 2019前端必会黑科技之PWA:https://www.jianshu.com/p/098af61bbe04 ...

  3. Junit+Mock单元测试

    项目用的是maven,所需jar包在pom.xml文件里面配置,单元测试要用的jar具体如下: <dependency> <groupId>junit</groupId& ...

  4. Git上传相关资料

    ############ssh key及 配置信息############# 设置Git的user name和email: $ git config --global user.name " ...

  5. 微信小程序全局属性

    通用全局属性:(前端也有) Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. undefined 指示未定义的值. 通用全局函数:(前端也有) decodeURI() 解码某 ...

  6. MYSQL中的UNION和UNION ALL

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  7. 学习python基础规则

    前面应该是记流水账的方式,毕竟学习的内容不多无法产出什么有效的内容. 这两天从开始下载Python开始学习,一路顺畅冒的问题,直到开始学习python的游戏规则,严格缩进.注释及‘’的使用等感觉还不错 ...

  8. python网络爬虫(5)BeautifulSoup的使用示范

    创建并显示原始内容 其中的lxml第三方解释器加快解析速度 import bs4 from bs4 import BeautifulSoup html_str = """ ...

  9. Java后端技术面试汇总(第四套)

    1.Java基础 • 为什么JVM调优经常会将-Xms和-Xmx参数设置成一样:• Java线程池的核心属性以及处理流程:• Java内存模型,方法区存什么:• CMS垃圾回收过程:• Full GC ...

  10. Linq Distinct 自定义比较

    private class MyMenuComparer : IEqualityComparer { public bool Equals(ParMenu x, ParMenu y){ return ...