「CF568C」 New Language

一眼 \(\texttt{2-SAT}\) 。

然后不会了。

又看了一会儿,然后发现只要我们确定每个位置大于字典序的两种最小的字母是啥,然后按位贪心,这个问题就解决了。

吗?

然后你发现限制很多:

如果前几位都和题目所给的字符串一样,你需要判断接下来还能不能一样。

如果有一位不同,那么接下来的位你都不需要考虑字典序,只需要考虑是否可行即可。这可以通过把后面的字符都设为 a 来解决。

然后,想清楚还需要打一会,然后这题就没了。

注意用 \(\texttt{DFS}\) 求解 \(\texttt{2-SAT}\) 的清空问题。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
#define add(a,b) e[a].emplace_back(b)
#define ano(x) (x>n?x-n:x+n)
using namespace std;
const int maxn=2e3+5;
char s[maxn],t[maxn];
vector<int> e[maxn];
int m0[maxn],m1[maxn];
int st[maxn],tp;
int b[maxn],n,m;
bool dfs(int u){
if(b[ano(u)]) return 0;
b[u]=1,st[++tp]=u;
for(auto v:e[u])
if(!b[v]&&!dfs(v)) return b[u]=0;
return 1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>(s+1);int l=strlen(s+1);
int t0=1e9,t1=1e9;
m0[l+1]=m1[l+1]=1e9;
for(int i=l;i;--i){
if(s[i]=='V') t0=i;
else t1=i;
m0[i]=t0,m1[i]=t1;
}
cin>>n>>m;
for(int i=1;i<=m;++i){
int a,c;string b,d;
cin>>a>>b>>c>>d;
a=(a+n*(b[0]=='C')),c=(c+n*(d[0]=='C'));
add(a,c),add(ano(c),ano(a));
}
cin>>(t+1);
for(int i=1;i<=n;++i) t[i]-=96;
int f=0;
for(int i=1;i<=n;++i){
tp=0;
if(f) t[i]=1;
pause:
if(m0[t[i]]==1e9){
if(m1[t[i]]==1e9||b[i]||!dfs(i+n)) cout<<"-1",exit(0);
}
else if(m1[t[i]]==1e9){
if(b[i+n]||!dfs(i)) cout<<"-1",exit(0);
}
else if(!b[i]&&!b[i+n]){
if(m0[t[i]]<m1[t[i]]){
if(!dfs(i)){
f=1;
if(!dfs(i+n)) cout<<"-1",exit(0);
}
}
else{
if(!dfs(i+n)){
f=1;
if(!dfs(i)) cout<<"-1",exit(0);
}
}
}
else if(b[i]?m0[t[i]]>t[i]:m1[t[i]]>t[i]) f=1;
if(!f){
for(int j=i+1;j<=n;++j){
if(b[j]){
if(m0[t[j]]==1e9){
++t[i],f=1;
break;
}
if(m0[t[j]+1]!=1e9) break;
}
else if(b[j+n]){
if(m1[t[j]]==1e9){
++t[i],f=1;
break;
}
if(m1[t[j]+1]!=1e9) break;
}
else if(m0[t[j]+1]!=1e9||m1[t[j]+1]!=1e9) break;
}
if(f){
while(tp) b[st[tp--]]=0;
goto pause;
}
}
}
for(int i=1;i<=n;++i) cout<<(char)(96+(b[i]?m0[t[i]]:m1[t[i]]));
return 0;
}

「CF568C」 New Language的更多相关文章

  1. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  2. POJ1061 青蛙的约会 和 LOJ2721 「NOI2018」屠龙勇士

    青蛙的约会 Language:Default 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133470 Accep ...

  3. 「MoreThanJava」机器指令到汇编再到高级编程语言

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  4. 「MoreThanJava」Java发展史及起航新世界

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  5. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  6. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  7. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  8. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  9. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

随机推荐

  1. Step By Step(Lua模块与包)

    Step By Step(Lua模块与包) 从Lua 5.1开始,我们可以使用require和module函数来获取和创建Lua中的模块.从使用者的角度来看,一个模块就是一个程序库,可以通过requi ...

  2. 【注意力机制】Attention Augmented Convolutional Networks

    注意力机制之Attention Augmented Convolutional Networks 原始链接:https://www.yuque.com/lart/papers/aaconv 核心内容 ...

  3. TensorRT深度学习训练和部署图示

    TensorRT深度学习训练和部署 NVIDIA TensorRT是用于生产环境的高性能深度学习推理库.功率效率和响应速度是部署的深度学习应用程序的两个关键指标,因为它们直接影响用户体验和所提供服务的 ...

  4. 深度学习调用TensorFlow、PyTorch等框架

    深度学习调用TensorFlow.PyTorch等框架 一.开发目标目标 提供统一接口的库,它可以从C++和Python中的多个框架中运行深度学习模型.欧米诺使研究人员能够在自己选择的框架内轻松建立模 ...

  5. 大规模数据处理Apache Spark开发

    大规模数据处理Apache Spark开发 Spark是用于大规模数据处理的统一分析引擎.它提供了Scala.Java.Python和R的高级api,以及一个支持用于数据分析的通用计算图的优化引擎.它 ...

  6. 使用adb命令在模拟器安装apk

    1.adb connect 127.0.0.1:7555 连接网易模拟器地址2.adb devices -L 查看有几个连接端口地址3.执行推送配置文件 命令 adb push 文件 路径

  7. 负载均衡算法: 简单轮询算法, 平滑加权轮询, 一致性hash算法, 随机轮询, 加权随机轮询, 最小活跃数算法(基于dubbo) java代码实现

    直接上干活 /** * @version 1.0.0 * @@menu <p> * @date 2020/11/17 16:28 */ public class LoadBlance { ...

  8. Fedora 34成哑巴了?

    原由 前几天刚更新了Fedora34,完全沉浸在Gnome40的喜悦中.但是今天用耳机听Apple Music的时候完全傻了,音量控制旋钮调了半天也没有声音,难道声卡坏了?于是,我试探性的用Parro ...

  9. 03:进程Queue --- 生产者消费者模型

    1 进程Queue介绍 1 进程间数据隔离,两个进程进行通信,借助于Queue​2 进程间通信:IPC -借助于Queue实现进程间通信    -借助于文件        -借助于数据库    -借助 ...

  10. 天天写order by,你知道Mysql底层如何执行吗?

    在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州的所有人名字,并且按照姓名进行排序返回前 10 ...