WA第四求助

P1071 [NOIP2009 提高组] 潜伏者

@[TPPPP](/user/577650) @[二叉苹果树](/user/270854)
by HouSibo @ 2023-08-20 22:04:19


同样的情况,我直接暴力查重qwq ```cpp #include <bits/stdc++.h> using namespace std; const int N = 1e4 + 5; char a[N]; // 表示密文对应的明文 (ch-'A') char c[N], c1[N]; // c为密文,c1为明文 char ch[N]; // 即将破译的密文 bool vis[N]; // 表示密字(ch-'A')被使用过了没 bool vis1[N]; // 表示明字(c1-'A')被使用过了没 // 1. 每个字母只对应一个唯一的密字,不同的字母对应不同的密字 // 2. A~Z在明文中都出现过,并拥有唯一不重复的密字 int main(){ memset (a, '1', sizeof a); scanf ("%s%s%s", c, c1, ch); // 密、明文查重 for (int i = 0; i < strlen(c1); ++i){ for (int j = i + 1; j < strlen(c1); ++j){ if (c1[i] == c1[j] && c[i] != c[j]){ printf ("Failed"); exit(0); } } } for (int i = 0; i < strlen(c); ++i){ if (vis[c[i]-'A'] == false && a[c[i]-'A'] == '1'){ a[c[i]-'A'] = c1[i]; vis[c[i]-'A'] = true; } else if (a[c[i]-'A'] == c1[i]){ continue; } else { printf ("Failed"); exit(0); } } for (int i = 0; i < 26; ++i) if (a[i] == '1'){ printf ("Failed"); exit(0); } for (int i = 0; i < strlen(ch); ++i) printf ("%c", a[ch[i]-'A']); return 0; } ```
by _IceCream_ @ 2023-08-28 11:17:58


我感觉这道题用五个char数组就可以了啊(第一个是加密的,第二个是解出来的,第三个是ABCDEFG……,第四个是A对应的秘文,B对应的秘文……(用if判断实现),第五个是新的秘文的译文)循环判断4数组有没有重。接着就可以靠下标(阿斯克马值减去-41或-40(看你的数组3“A”从下标几开始(0就减41,1就减40)))来揪出对应的字母,有没对应上的(对应下标的2数组为空)直接输出Failed然后return 0,其余的话就把转换好的密码存到数组5里面。最后建立一个变量a为数组5的长度(具体操作我不太懂,但我看过别人做),b为0/1,最后循环a次,输出最后一个数组[b],b++。(本人为小学生,口头表达力不好,见谅)(没试过,一个思路)
by JoanneLi @ 2023-08-31 16:05:48


|