「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;
}

最新文章

  1. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
  2. 转载:hdu 动态规划题集
  3. 第二章、 Linux 如何学习
  4. html5文件上传
  5. bootstrap-fileinput 图片上传
  6. Dokcer 组成原理简介
  7. BZOJ2440(全然平方数)二分+莫比乌斯容斥
  8. 计算机学院大学生程序设计竞赛(2015’12) 1002 Polygon
  9. IM 融云 之 开发基础概念
  10. 关于企业选取ERP软件的建议
  11. 笔记:Maven 配置文件模板
  12. 读《Linux内核设计与实现》我想到了这些书
  13. windows配置java运行环境
  14. Mybatis自动生成,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题
  15. (转)HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面
  16. pt-table-checksum工具MySQL主从复制数据一致性
  17. CentOS安装sctp协议
  18. formidable处理多文件上传
  19. SQL触发器实例(上)
  20. Linux - Seafile

热门文章

  1. 从栈上理解 Go语言函数调用
  2. Go语言流程控制05--defer延时执行
  3. Go基础结构与类型06---房贷计算器
  4. CVPR2020:基于自适应采样的非局部神经网络鲁棒点云处理(PointASNL)
  5. .NET平台系列23:.NET Core/.NET5/.NET6 和 .NET Framework 的选择建议
  6. C语言数组初始化方式
  7. NX二次开发】Block UI 选择特征
  8. 使用 Hexo 搭建静态博客
  9. 利用SPI机制实现责任链模式中的处理类热插拔
  10. external-attacher源码分析(1)-main方法与启动参数分析