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

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

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

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define PB push_back
  5. int color[];
  6.  
  7. int G[][];
  8. const int maxn = 1e5+;
  9. char s[maxn];
  10. bool vis[];
  11.  
  12. char mp[];
  13.  
  14. bool bipartite(int u)
  15. {
  16. for(int v = ; v < ; v++) if(G[u][v]) {
  17. if(color[v] == color[u]) return false;
  18. if(!color[v]){
  19. color[v] = - color[u];
  20. if(!bipartite(v)) return false;
  21. }
  22. }
  23. return true;
  24. }
  25.  
  26. char tab[] = {'A','E','I','O','U'};
  27. int tsz = ,tsz2 = ;
  28. char tab2[] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z'};
  29.  
  30. vector<string> word;
  31. vector<int> bcc[][];
  32. int bcnt;
  33.  
  34. bool dfs(int d,int cur,int s)
  35. {
  36. if(d == bcnt){
  37. if(cur == ){
  38. for(int i = ; i < bcnt; i++){
  39. vector<int> &v = bcc[i][(s>>i)&];
  40. for(int j = ; j < v.size(); j++){
  41. mp[v[j]] = tab[tsz++];
  42. }
  43. }
  44. return true;
  45. }
  46. return false;
  47. }
  48. if(dfs(d+,cur+bcc[d][].size(),s)||dfs(d+,cur+bcc[d][].size(),s|(<<d))) return true;
  49. return false;
  50. }
  51.  
  52. int main()
  53. {
  54. //freopen("in.txt","r",stdin);
  55. freopen("javanese.in","r",stdin);
  56. freopen("javanese.out","w",stdout);
  57. while(~scanf("%s",s)){
  58. word.PB(s);
  59. for(int i = ; s[i]; i++){
  60. int u = s[i] - 'A', v = s[i-] - 'A';
  61. G[u][v] = G[v][u] = ;
  62. }
  63. }
  64.  
  65. for(int i = ; i < ; i++)if(!color[i]){
  66. color[i] = ;
  67. if(!bipartite(i)) { puts("impossible"); return ; }
  68. for(int i = ; i < ; i++) if(color[i]&&!vis[i]) {
  69. vis[i] = true;
  70. bcc[bcnt][color[i]-].PB(i);
  71. }
  72. bcnt++;
  73. }
  74.  
  75. if(!dfs(,,)) { puts("impossible"); }
  76. else {
  77. for(int i = ; i < ; i++) if(!mp[i]) mp[i] = tab2[tsz2++];
  78. for(int j = ; j < word.size(); j++){
  79. if(j) putchar(' ');
  80. string & str = word[j];
  81. for(int i = ; i < str.size(); i++){
  82. if('A'<=str[i]&&str[i]<='Z')
  83. putchar(mp[str[i]-'A']);
  84. else putchar(str[i]);
  85. }
  86. }
  87. putchar('\n');
  88. }
  89. return ;
  90. }

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. HDU - 2689 Sort it与2016蓝桥杯B 交换瓶子 排序(相邻交换与任意交换)

    Sort it You want to processe a sequence of n distinct integers by swapping two adjacent sequence ele ...

  2. 《剑指offer》面试题22—栈的压入、弹出序列

    <程序员面试宝典>上也有经典的火车进站问题,类似. 如果12345是压栈顺序,序列45321可能是出栈顺序,但序列43512不可能. 规律:对序列中任意元素n,排在n后且比n小的元素一定是 ...

  3. 19个很有用的 JavaScript库推荐

    流行的 JavaScript 库有jQuery,MooTools,Prototype,Dojo和YUI等,这些 JavaScript 库功能丰富,加上它们众多的插件,几乎能实现任何你需要的功能 然而需 ...

  4. JSP 标准标签库(JSTL)(菜鸟教程)

    菜鸟教程 JSTL 1.1 与 JSTL 1.2 之间的区别?如何下载 JSTL 1.2? JSTL 1.2 中不要求 standard.jar 包. 您可以在 Maven 中央仓库中找到它们. ht ...

  5. (转)机器学习——深度学习(Deep Learning)

    from:http://blog.csdn.net/abcjennifer/article/details/7826917 Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立 ...

  6. CF1119F Niyaz and Small Degrees【treedp+堆】

    如果枚举d来dp,那么就是设f[u][0/1]为u点不断/断掉和父亲的边,然后优先选取f[v][1]+w(u,v)<=f[v][0]的,如果断掉这些度数还是多就用一个堆维护剩下的按f[v][1] ...

  7. IT兄弟连 JavaWeb教程 创建异步请求对象

    异步请求对象:XMLHttpRequest对象,通过该对象向服务器发送异步请求.它是异步请求的技术,所有的现代浏览器(IE7+.FireFox.Chrome.Safari以及Opera)都支持,老版本 ...

  8. A JAX-WS web service is by itself a Singleton

    http://stackoverflow.com/questions/11096310/singleton-object-in-java-web-service http://stackoverflo ...

  9. 5.用通配符进行过滤 ---SQL

    一.LIKE操作符 通配符(wildcard) 用来匹配值的一部分的特殊字符.搜索模式(search pattern)由字面值.通配符或两者组合构成的搜索条件.通配符本身实际上是SQL的WHERE子句 ...

  10. XmlSerilizer序列化出错时,不妨考虑BinaryFormatter

    当你使用XmlSerilizer序列化一个结构复杂的类型时出现反射出错 XmlSerilizer并不会告诉你哪个字段属性或者嵌套的字段属性不能被序列号,面对多年前的代码逐一排查很恼人使用BinaryF ...