2008 - 解密
时间限制 : 1 秒
内存限制 : 128 MB
话说有一种加密方法,得出的密文是一个全部是小写字母的矩阵,解密的方法是将这些矩阵每一行和每一列的所有重复的字母都去掉,得到的结果从上到下,从左到右排成一排,这一排就是解出来的密码。
给出密文,请解出密码。
题目输入
第一行输入两个数n,m,n,m<100,表示密文的行数和列数,接下来n行,每行m个小写字母,表示密文。
题目输出
每个样例输出一行,表示解出的密码。保证解出来的密码不为空。
输入/输出样例
输入格式
3 3 abc bcd cbc
输出格式
abcd
C++解答
#include<stdio.h> #include<string.h> #include<algorithm> #define INF 100000000 using namespace std; char a[100][100]; int b[100][100]; int zm[26]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(b,0,sizeof(b)); for(int i=0;i<n;i++) scanf("%s",a[i]); for(int i=0;i<n;i++) { memset(zm,0,sizeof(zm)); for(int j=0;j<m;j++) { zm[a[i][j]-'a']++; if(zm[a[i][j]-'a']==2) { for(int o=0;o<m;o++) if(a[i][o]==a[i][j]) b[i][o]=INF; } } } for(int i=0;i<m;i++) { memset(zm,0,sizeof(zm)); for(int j=0;j<n;j++) { zm[a[j][i]-'a']++; if(zm[a[j][i]-'a']==2) { for(int o=0;o<n;o++) if(a[o][i]==a[j][i]) b[o][i]=INF; } } } for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(b[i][j]!=INF) printf("%c",a[i][j]); } printf("\n"); } }
Python解答
import sys line=sys.stdin.readline() while line: #print line n,m=map(int,line.split()) ma=[] ans="" for i in range(n): line=sys.stdin.readline() ma.append(line) for i in range(n): for j in range(m): tag=1 for k in range(n): #print map[k][j],map[i][j] if ma[k][j]==ma[i][j] and k!=i: tag=0 break for k in range(m): if tag==0: break if ma[i][j]==ma[i][k] and k!=j: tag=0 break if tag: ans+=ma[i][j] print ans line=sys.stdin.readline()