「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. kind:Kubernetes in Docker,单机测试 Kubernetes 群集的最佳方案

    请访问原文发布链接:https://sysin.org/article/kind/,查看最新版. 作者:gc(at)sysin.org,主页:www.sysin.org 2021.04.28 更新,k ...

  2. python工业互联网应用实战17—前后端分离模式之django template vs jquery3

    上一章节我们完成了"CRUD"的后面3个功能点,新增由于改动较大我们专门增加本章来阐述,主要是完成技术栈切换后,会发现模板的代码判断过多,逻辑过于复杂.对未来存在的扩展和维护友好性 ...

  3. 写Bug时,需要注意的几点3

    在对象之间搬移特性 类往往会因为承担过多责任而变得臃肿不堪. (Move Method)搬移函数 含义:在程序中,里面的一个函数与其类外面的一个类或函数有着紧密的调用或者被调用,则需要对其函数内部的表 ...

  4. App元素定位三种方法

    来自博客: http://testingpai.com/article/1595507262082 以下方法操作前必须确保有手机设备连入电脑,检测是否有手机连入命令 adb devices 第一种:A ...

  5. 大尺寸卫星图像目标检测:yoloT

    大尺寸卫星图像目标检测:yoloT 1. 前言 YOLT论文全称「You Only Look Twice: Rapid Multi-Scale Object Detection In Satellit ...

  6. MindSpore静态图语法支持

    MindSpore静态图语法支持 概述 在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图. 关于Graph模式和计算图,可参考文档: ...

  7. 在 CUDA C/C++ kernel中使用内存

    在 CUDA C/C++ kernel中使用内存 如何在主机和设备之间高效地移动数据.本文将讨论如何有效地从内核中访问设备存储器,特别是 全局内存 . 在 CUDA 设备上有几种内存,每种内存的作用域 ...

  8. C#-防止用户输入具有风险的敏感字符

    最近有涉及到要防止用户在网页文本框中输入具有风险的敏感字符所以特地编写了一套针对用户输入的字符进行安全过滤的一个方法,在后台接收到用户输入的字符后调用执行该方法即可完成过滤操作,主要使用正则来匹配并替 ...

  9. 谁才是智能家居的未来?视声M+O融合方案给出答案

    有些智能家居,你不能说它不智能. 但在现实生活中,常常帅不过一秒. 就比如,当你经历了一天的疲惫后回到家,发现玄关的智能开关突然没反应,家里的灯怎么都打不开.这种时候你得明白,你的智能开关面板很有可能 ...

  10. js 统计图插件chart.js

    chart是一个纯js插件,它功能强大小巧使用也很简单. 第一步引入 chart.js . <script type="text/javascript" src=" ...