「CF568C」 New Language
「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的更多相关文章
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- POJ1061 青蛙的约会 和 LOJ2721 「NOI2018」屠龙勇士
青蛙的约会 Language:Default 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 133470 Accep ...
- 「MoreThanJava」机器指令到汇编再到高级编程语言
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 「MoreThanJava」Java发展史及起航新世界
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
随机推荐
- 【Azure 应用服务】由 Azure Functions runtime is unreachable 的错误消息推导出 ASYNC(异步)和 SYNC(同步)混用而引起ThreadPool耗尽问题
问题描述 在Azure Function Portal上显示: Azure Functions runtime is unreachable,引起的结果是Function App目前不工作,但是此前一 ...
- YOLOv4 资源环境配置和测试样例效果
YOLOv4 资源环境配置和测试样例效果 基本环境:cuda=10.0,cudnn>=7.0, opencv>=2.4 一.下载yolov4 git clone https://githu ...
- Thumb扩展
Thumb扩展 ARM处理器已在嵌入式系统,手持计算机和其系统中得到了最大的应用,在这些系统中,系统对使用有限资源进行大量工作的要求很高.Thumb扩展是为解决资源消耗中的某些方面而创建的,已成为当今 ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- HAL库|神器cubemx的正确打开方式
前言 工欲善其事,必先利其器.HAL库的开发不一定必须使用cubemx,但是使用了cubemx,你绝对不会后悔.基于一些小伙伴对cubemx的使用还有一些疑问,本次小飞哥从新建工程到生成工程,编写应用 ...
- Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache.org/schema/dubbo]
dubbo的官方文档写的真好, http://dubbo.apache.org/zh-cn/docs/2.7/user/dependencies/ 在使用dubbo过程中的问题, 和解决 org.sp ...
- 从一条sql报错解决过程学习程序员查bug的思路
从oracle迁移数据到达梦后,发现数据库默认值都丢失了.于是我想从oracle数据库将默认值查出来,在达梦数据库加回去. 于是上网查了一下,看怎么获取oracle数据库字段默认值信息,找到了这个sq ...
- UF_PART 部件操作
Open C uc5000 uc5001uc5003UF_PART_add_to_recent_file_listUF_PART_apply_family_instanceUF_PART_ask_co ...
- 【linux】驱动-12-并发与竞态
目录 前言 12. 并发&竞态 12.1 并发&竞态概念 12.2 竞态解决方法 12.3 原子 12.3.1 原子介绍 12.3.2 原子操作步骤 12.3.3 原子 API 12. ...
- Spring Boot WebFlux-03——WebFlux 整合 MongoDB
第03课:WebFlux 整合 MongoDB 前言 上一课的内容讲解了用 Map 数据结构内存式存储了数据,这样数据就不会持久化,本文我们用 MongoDB 来实现 WebFlux 对数据源的操作. ...