Uvalive 4380

题意是给出一段密文,要求找出找一种解密方式,使得解密后的文本,任意一个单词都是元辅音间隔形成的。
数据输入比较恶心,单词之间可以是空格间隔,也可以是换行符间隔,因此必须读到一个空的行才表示一个TestCase结束。
输入的文本,处理出所有单词相邻字母的情况,存储在一个26*26的二维数组中,G[u][v]表示’A’+u与’A’+v在密文中相邻。
五重循环,枚举原文中的五种元音:AEIOU,分别对应密文中的哪几个字母,那么剩下的辅音字母就对应密文中未被映射的字母。
根据枚举出来的映射判断原文中是否存在元音相邻,或者辅音相邻的情况,存在则继续枚举,不存在则有解,根据映射输出原文即可。
TestCase之间要输出一个空行。

#include<map>
#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#define LL long long
#define LLU long long usigned
#define ls (root<<1)
#define rs (root<<1|1)
#define LSON  ls,l,mid
#define RSON rs,mid+1,r
#define mm(a,b) memset(a,b,sizeof(a))
#define cl(a) memset(a,0,sizeof(a))
#define mm0x3f(a) memset(a,0x3f,sizeof(a))
#define mm_1(a) memset(a,-1,sizeof(a))
#define debug puts("It's o k here")
#define mp make_pair
#define rep(a,b,c) for(int a=(b);a<(c);a++)
using namespace std;
const int Inf=0x3f3f3f3f;
const int maxn=1e6+5;
const int maxnode=1e5+5;
const int sigma_size=26;
const int maxs=105;//pattern string numbers
const int maxt=1e3+5;int n, m;
char s[maxn];
int G[sigma_size][sigma_size];
int vow[sigma_size], oth[sigma_size];
int vow_cnt, oth_cnt;
int is_vowel[26];
int v[5], v2[26];
vector<string> sset;
void output(){
//    for(int i=0;i<5;i++)
//        printf("%c ",v[i]+'A');
//    for(int i=0;i<26;i++)
//    if(!is_vowel[i]) printf("%c->%c\n", 'A'+i, v2[i]+'A');
//    puts("");for(int si=0;si<sset.size();si++){n=sset[si].length();for(int i=0;i<n;i++)if(sset[si][i]!=' '){int j=sset[si][i]-'A';if(j==v[0]) printf("A");else if(j==v[1]) printf("E");else if(j==v[2]) printf("I");else if(j==v[3]) printf("O");else if(j==v[4]) printf("U");else printf("%c",v2[j]+'A');}else printf(" ");puts("");}
}
void solve(){int no_ans=0;for(v[0]=0;v[0]<26;v[0]++)for(v[1]=v[0]+1;v[1]<26;v[1]++)for(v[2]=v[1]+1;v[2]<26;v[2]++)for(v[3]=v[2]+1;v[3]<26;v[3]++)for(v[4]=v[3]+1;v[4]<26;v[4]++){//map vowels in source text to character in encoded textno_ans=0; cl(is_vowel);for(int i=0;i<5;i++) is_vowel[v[i]]=1;for(int i=0;i<5&&!no_ans;i++)for(int j=0;j<5&&!no_ans;j++)if(G[v[i]][v[j]])  no_ans=1;if(no_ans){continue;}for(int i=0;i<26&&!no_ans;i++)for(int j=0;j<26&&!no_ans;j++)if(!is_vowel[i]&&!is_vowel[j]&&G[i][j]) no_ans=1;if(no_ans){continue;}for(int i=0, j=0;i<26;i++)if(!is_vowel[i]){v2[i]=oth[j++];}output();return;}puts("impossible");
}
int main(){int T, cas=0;bool flag;for(int i=0;i<26;i++)if('A'+i!='A'&&'A'+i!='E'&&'A'+i!='I'&&'A'+i!='O'&&'A'+i!='U'){oth[oth_cnt++]=i;}while(gets(s)){sset.clear();if(cas++!=0) printf("\n");cl(G); cl(is_vowel);do{n=strlen(s);for(int i=1;i<n;i++)if(s[i-1]!=' '&&s[i]!=' '){int u=s[i-1]-'A';int v=s[i]-'A';G[u][v]=1; G[v][u]=1;}sset.push_back(string(s));}while((flag=gets(s))&&s[0]);solve();if(!flag) break;}return 0;
}

UVALive - 4380 Javanese Cryptoanalysis相关推荐

  1. codeforces Gym 100286J Javanese Cryptoanalysis (二染色)

    每一单词相邻两个字母,不能同时为元音或者辅音... 各种姿势都可以过:7个for,dp,黑白染色,dfs,并查集.... 最主要的思路就是相邻字母连边,把元音和辅音看成两个集合,那么有连边的两个字母一 ...

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

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

  3. DP UVALive 6506 Padovan Sequence

    题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...

  4. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...

  5. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  6. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  7. 逆序数 UVALive 6508 Permutation Graphs

    题目传送门 1 /* 2 题意:给了两行的数字,相同的数字连线,问中间交点的个数 3 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 4 用归并排序或线段树求 ...

  8. Infinite Fraction Path UVALive - 8207

    Infinite Fraction Path UVALive - 8207 题意: 给你n个数,每个数在0到9之间,每个数的下标一次是0~n-1,然后他所能走到的数为(i^2+1)%n,i为他本身的下 ...

  9. F - Heron and His Triangle UVALive - 8206

    F - Heron and His Triangle UVALive - 8206 题意: 给你应该n,然后求一个最小的t,问长度为t-1,t,t+1所组成的三角形的面积为整数,t>=n 题解: ...

最新文章

  1. USNews 2020美国大学排名公布:UCLA超越伯克利;计算机专业MIT第一,斯坦福跌出前四...
  2. NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN
  3. csdn将文章添加到专栏
  4. 干货 | B端产品如何设计权限系统?
  5. linux内核关闭tcp校验,linux内核tcp调优规范与方案
  6. Windows环境下通过Git来管理自己的Android代码
  7. hdu acm 1241
  8. 作为无人机方面做嵌入式编写的飞控总结5-磁力计对航向角yaw的校准2(磁力计如何校正航向)
  9. 小觅相机运行VINS-Fusion(二)——Camera-IMU参数标定
  10. 移远UMTS LTE EVB Kit
  11. USB转换PS2接线原理
  12. <aop:aspectj-autoproxy />AOP自动代理
  13. oracle+获取最后一行数据库,获取表最后一条数据
  14. java/php/net/python“最终幻想14”游戏时装图鉴网站设计与制作
  15. 气象卫星_全国自动站资料文件名规定(1)
  16. CDA Level1知识点总结之多维数据透视分析
  17. 免费共享给大家一些免费的代理服务器(包括sock http https)
  18. Mac制作U盘安装盘和安装系统
  19. 200115(最小生成树的Kruskal算法(贪心))
  20. composer 指定PHP版本

热门文章

  1. (MacOS)来做一个简单带有音乐提醒的python倒计时器吧~
  2. Silverlight 4实现在线大头贴程序,支持打印
  3. rgv调度问题c语言实现,基于效率最大化的RGV动态调度的算法设计与程序验证
  4. 关于客户机未连接 (32104) 的处理
  5. C++深拷贝与浅拷贝的区别-简单易懂
  6. python 分箱函数_Python子框,python,分箱
  7. FPGA复位的正确使用
  8. 二级Access数据库视频教程
  9. Shuriken粒子系统学习笔记
  10. (校赛)救救曹植(贪心)