「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. 解决了一个java服务线程退出的问题

    问题背景 ​ 早上才上班,测试就提了一个问题:"昨天所有批量任务都没有跑".我看了一下任务监控页面,任务是有生成的,但却一直在等待调度状态.初步怀疑是我们的调度服务问题,于是上去查 ...

  2. redis中AOF和RDB的关闭方法

    redis中AOF和RDB的关闭方法   问题:当往redis中导入数据时,有时会出现redis server went away的情况: 原因: 导入的数据量太大,而内存不够(即内存1G,但数据有2 ...

  3. Linux分区创建、挂载

    fdisk -l 这块盘是没有分区的,没有被使用. fdisk /dev/vdb 操作这块磁盘, 创建分区 格式化/dev/sdb1为ext4 mkfs -t ext4 /dev/vdb1 mkfs. ...

  4. Python 扩展 Op

    Python 扩展 Op 注意 :本文涉及的 Python Kernel 仅在 gcc 4.8.5 编译环境下充分测试,进一步的完善计划见 Issue 3951. 背景介绍 OneFlow 将各种对于 ...

  5. SpringBoot2 参数管理实践,入参出参与校验

    一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...

  6. Appium UI自动化测试

    #coding:utf-8 from appium import webdriver import time,traceback ''' desired_capabilities:这些键告诉appiu ...

  7. 使用firefox打开网页报错——Error: no display specified

    想在linux环境下打开一个网页,环境描述:在窗口模式下,打Terminal,然后从本地服务器ssh到了另一个服务器,想执行firefox命令打开一个网页,如下 [root@pc207 ~]# fir ...

  8. CloudCanal

    CloudCanal 是一款数据迁移同步工具,帮助企业快速构建高质量数据流通通道,产品包含 SaaS 模式和私有输出专享模式.开发团队核心成员来自大厂,具备数据库内核.大规模分布式系统.云产品构建背景 ...

  9. python读取csv文件数据绘制图像,例子绘制天气每天最高最低气温气象图

  10. Auto.js无障碍免root脚本开发学习

    Auto.js 简单入门 官方文档:https://hyb1996.github.io/AutoJs-Docs/#/ https://blog.csdn.net/QiHsMing/article/de ...