每一单词相邻两个字母,不能同时为元音或者辅音。。。

各种姿势都可以过:7个for,dp,黑白染色,dfs,并查集。。。。

最主要的思路就是相邻字母连边,把元音和辅音看成两个集合,那么有连边的两个字母一定不能出现在同一个集合中,于是想到了二分图判断的二染色。

比较坑的是,必须要出现5个元音字母

见识到了str = str + str2有多慢

#include<bits/stdc++.h>
using namespace std; #define PB push_back
int color[]; int G[][];
const int maxn = 1e5+;
char s[maxn];
bool vis[]; char mp[]; bool bipartite(int u)
{
for(int v = ; v < ; v++) if(G[u][v]) {
if(color[v] == color[u]) return false;
if(!color[v]){
color[v] = - color[u];
if(!bipartite(v)) return false;
}
}
return true;
} char tab[] = {'A','E','I','O','U'};
int tsz = ,tsz2 = ;
char tab2[] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z'}; vector<string> word;
vector<int> bcc[][];
int bcnt; bool dfs(int d,int cur,int s)
{
if(d == bcnt){
if(cur == ){
for(int i = ; i < bcnt; i++){
vector<int> &v = bcc[i][(s>>i)&];
for(int j = ; j < v.size(); j++){
mp[v[j]] = tab[tsz++];
}
}
return true;
}
return false;
}
if(dfs(d+,cur+bcc[d][].size(),s)||dfs(d+,cur+bcc[d][].size(),s|(<<d))) return true;
return false;
} int main()
{
//freopen("in.txt","r",stdin);
freopen("javanese.in","r",stdin);
freopen("javanese.out","w",stdout);
while(~scanf("%s",s)){
word.PB(s);
for(int i = ; s[i]; i++){
int u = s[i] - 'A', v = s[i-] - 'A';
G[u][v] = G[v][u] = ;
}
} for(int i = ; i < ; i++)if(!color[i]){
color[i] = ;
if(!bipartite(i)) { puts("impossible"); return ; }
for(int i = ; i < ; i++) if(color[i]&&!vis[i]) {
vis[i] = true;
bcc[bcnt][color[i]-].PB(i);
}
bcnt++;
} if(!dfs(,,)) { puts("impossible"); }
else {
for(int i = ; i < ; i++) if(!mp[i]) mp[i] = tab2[tsz2++];
for(int j = ; j < word.size(); j++){
if(j) putchar(' ');
string & str = word[j];
for(int i = ; i < str.size(); i++){
if('A'<=str[i]&&str[i]<='Z')
putchar(mp[str[i]-'A']);
else putchar(str[i]);
}
}
putchar('\n');
}
return ;
}

codeforces Gym 100286J Javanese Cryptoanalysis (二染色)的更多相关文章

  1. Codeforces Gym 100286J Javanese Cryptoanalysis 傻逼暴力

    原题地址:http://codeforces.com/gym/100286/attachments/download/2013/20082009-acmicpc-northeastern-europe ...

  2. CodeForces Gym 100213F Counterfeit Money

    CodeForces Gym题目页面传送门 有\(1\)个\(n1\times m1\)的字符矩阵\(a\)和\(1\)个\(n2\times m2\)的字符矩阵\(b\),求\(a,b\)的最大公共 ...

  3. NOIP2010关押罪犯 二分+二染色

    这个题一上来 没有思路,后来想没有思路就二分吧 那么我们来二分 首先,大于当前的mid值的关系,不能出现在一个集合里 (即关系形成的图是一个二分图,判定二分图可以二染色) 如果不能形成二分图,那么说明 ...

  4. Codeforces Gym 101252D&&floyd判圈算法学习笔记

    一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...

  5. Codeforces Gym 101190M Mole Tunnels - 费用流

    题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...

  6. Codeforces Gym 101623A - 动态规划

    题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求划分成最少的段数,然后将这些段排序使得新序列单调不减. 考虑将相邻的相等的数缩成一个数. 假设没有分成了$n$段,考虑最少能够减少多少划分 ...

  7. 【Codeforces Gym 100725K】Key Insertion

    Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...

  8. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  9. hdu 5285 wyh2000 and pupil(二染色)

    第一次用vector解得题.值得纪念,这道题是二染色问题,我用bfs解得.就是染色,推断,计数问题,其 实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,由于题目要求每一个组至少有一个 ...

随机推荐

  1. xrange与range之间的区别

    对于这两个好像功能都差不多,这两个经常会被搞混,所以今天一定要把这个完全弄清楚. 首先我们看看range: range([start,] stop[, step]),根据start与stop指定的范围 ...

  2. RabbiMQ原理与SpringBoot使用

    RabbiMQ介绍 具体代码可参考我的github:https://github.com/UniqueDong/springboot-study 一.使用场景 RabbitMQ是一个消息中间件,所以最 ...

  3. Mysql深入理解(1)

    一.关系型数据主要: 1.架构,2.索引,3.锁,4.语法,5.理论范式 二.设计一个关系型数据库有哪些模块: 存储管理,缓存机制,Sql解析,日志管理,权限划分,容灾机制,索引管理,锁管理管理 1. ...

  4. Acwing 98-分形之城

    98. 分形之城   城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现. 而这座名为 Fractal 的城市设想了这样 ...

  5. 五分钟搞定 Linux 文档全部知识,就看这篇文章

    作者:无痴迷,不成功 来源:见文末 写在前面 我们都知道Linux是一个支持多用户.多任务的系统,这也是它最优秀的特性,即可能同时有很多人都在系统上进行工作,所以千万不要强制关机,同时,为了保护每个人 ...

  6. [WebShow系列] 倒计时展示相关问题

    WebShow内置了倒计时功能. 后台参数维护: 倒计时参数说明: 倒计时基准时间设置(秒数):假设设置为90,也就是从1分30秒开始倒计时,同时有开始提示音. 倒计时提示1剩余秒数:假设设置为30, ...

  7. Centos 6.x 安装 Redis

    本文以Centos6.8为例子,来进行演示. 1:下载最新版的Redis,比如我们安装在根目录下的redis文件下中 tar zxvf http://download.redis.io/release ...

  8. dp优化1——sgq(单调队列)

    该文是对dp的提高(并非是dp入门,dp入门者请先参考其他文章) 有时候dp的复杂度也有点大...会被卡. 这几次blog大多数会讲dp优化. 回归noip2017PJT4.(题目可以自己去百度).就 ...

  9. 定时任务crontab 详解

    cron 是一个可以用来根据时间.日期.月份.星期的组合来调度对重复任务的执行的守护进程. cron 假定系统持续运行.如果当某任务被调度时系统不在运行,该任务就不会被执行. 要使用 cron 服务, ...

  10. STM32空闲中断

    收发共存的思路没有经过验证!!! 空闲中断:既可以用来作为不定长接收数据帧的断帧判断/特别是DMA数据的接收,也可以用来指示中断发送的结束. 在需要发送的地方USART_ITConfig(UART5, ...