Aizu 1317 - Weaker than Planned 注意DFS时的顺序
2013-11-29 12:23
399 查看
题意:
已知明文和密文的转换是通过二元对应关系来的...如f(A,Z)代表在明文中的A将在密文中以Z代替...并且也代表了明文中的Z在密文中以A代替...
现在给了一些明文的单词(至多20个)...再给了一串密文(总长度至多80)..已知这串密文是由上面某些明文的单词变换而组成的..现在问能否唯一确定密文对应的明文...
题解:
直接DFS就行了....值得注意的是对于密文单词和明文单词..都先确定了长串..再依次往长度小的串确定..效率不是快一点半点..
Program:
已知明文和密文的转换是通过二元对应关系来的...如f(A,Z)代表在明文中的A将在密文中以Z代替...并且也代表了明文中的Z在密文中以A代替...
现在给了一些明文的单词(至多20个)...再给了一串密文(总长度至多80)..已知这串密文是由上面某些明文的单词变换而组成的..现在问能否唯一确定密文对应的明文...
题解:
直接DFS就行了....值得注意的是对于密文单词和明文单词..都先确定了长串..再依次往长度小的串确定..效率不是快一点半点..
Program:
#include <iostream> #include <string.h> #include <cmath> #include <algorithm> #include <stdio.h> using namespace std; string s[2000],a[310],out[2000]; char ss[2000]; int turn[360],ans,T[360]; void dfs(int p,int n,int m) { int i,x,len=s[p].length(),temp[260]; if (p>m) { ans++; for (x=0;x<26;x++) T[x]=turn[x]; return; } for (i=1;i<=n;i++) { if (len!=a[i].length()) continue; for (x=0;x<26;x++) temp[x]=turn[x]; for (x=0;x<len;x++) { if (turn[s[p][x]-'A']!=-1 && turn[s[p][x]-'A']!=a[i][x]-'A') break; if (turn[a[i][x]-'A']!=-1 && turn[a[i][x]-'A']!=s[p][x]-'A') break; turn[s[p][x]-'A']=a[i][x]-'A', turn[a[i][x]-'A']=s[p][x]-'A'; } if (x==len) dfs(p+1,n,m); if (ans>1) return; for (x=0;x<26;x++) turn[x]=temp[x]; } } bool cmp(string a,string b) { if (a.length()!=b.length()) return a.length()>b.length(); return a<b; } int main() { int n,m,len,x,i; while (~scanf("%d",&n) && n) { for (i=1;i<=n;i++) scanf("%s",ss),a[i]=ss; sort(a+1,a+1+n,cmp); m=0; while (scanf("%s",ss) && ss[strlen(ss)-1]!='.') s[++m]=ss,out[m]=ss; ss[strlen(ss)-1]='\0',s[++m]=ss,out[m]=ss; sort(s+1,s+1+m,cmp); memset(turn,-1,sizeof(turn)); ans=0; dfs(1,n,m); if (ans==1) { for (i=1;i<=m;i++) { len=out[i].length(); for (x=0;x<len;x++) printf("%c",T[out[i][x]-'A']+'A'); if (i!=m) printf(" "); } puts("."); }else puts("-."); } return 0; }
相关文章推荐
- sql解析顺序及注意问题
- 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs
- 如何使用 MasterPage(注意母板页和子页面的执行顺序)
- [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序
- 注意语句顺序 防止Servlet Request Response乱码
- 浮点型数据的比较2010-04-16 12:15应注意排列顺序
- 【javaweb:事务控制】事务控制两个方法在插入存在主从表关系的数据时应该注意的顺序问题!
- C++多线程环境下注意共享资源的释放顺序
- 注意,NSView不能保证subview的z轴顺序
- 注意语句顺序 防止Servlet Request Response乱码
- 写正确函数需要注意的地方:翻转句子中单词的顺序。
- 在SQL Server中使用种子表生成流水号注意顺序
- mybatis配置文件,注意标签配置顺序。否则报错The content of element type "configuration" must match "(properties?,settin
- web中过滤器的顺序要注意,中文乱码问题
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
- 如何使用 MasterPage(注意母板页和子页面的执行顺序)
- !POJ 2488 dfs--按顺序搜索
- Q98:三角形网格细分Bezier曲面时,注意三角形顶点的顺序(确保其对应的法向量向外)
- 使用SQL存储过程要特别注意的问题-注意顺序读取
- 打造最强大最完美的开发环境:Win 2008 R2安装激活、设置优化、可用杀毒软件、常用软件安装顺序与注意事项