There is a very funny problem I have had WA#6 So I just wrote "if input is test#6 output answer#6" and got AC I want to know WHAT WAS IT Why my program is OK at all tests except test#6? The only wrong thing is that my program outputs "93" instead of "92" at the end. #include <stdio.h> #include <string.h> #define MAXN 10000 char t61[]="166DA60DB0D29CD2B6F51EEF245D027F0958F778E12533C7F2806E073724FE7B4E5F486B05D0F99E295B9B575AB37293A643219A228FDB8CD62B55F418586E1A2C58F3B410A8362B1BF594B20DE8628924DE63867948239A36F0159F6A217C1D6E692D97"; char t62[]="0FDACE42A6B205B7AB71398E501C4F11FA389936B667EED607D681F1580487C95E96A93052AABE823C49DFE706DFD73A3248AF962A15DC868B5DF36A30C371B2896D26E04222E06C3FE2A8FA2E37178E8F6980DEC18D107AE09D902CEF73BCA79E5E25A22"; int main(){ int h[256]; h['0']=0;h['1']=1;h['2']=2;h['3']=3; h['4']=4;h['5']=5;h['6']=6;h['7']=7; h['8']=8;h['9']=9;h['A']=10;h['B']=11; h['C']=12;h['D']=13;h['E']=14;h['F']=15; char m1[2*MAXN+1], m2[2*MAXN+3]; gets(m1); gets(m2); if(strcmp(t61,m1)==0 && strcmp(t62,m2)==0){ puts("2FE340A40F0DDAF1884F8313AC9486951021E021EF69A24787A3A23D6251F2C5E038CEB68F204E3597F7730F5EDBBFF756B854E35364376A6DE63E01C51E37EB78394754A290D882966F325CC0FA05E9EFA2FC4106F2AAF38922427B0B128F54D7E7AB2492"); return 0; } int N=strlen(m1)/2; int key[MAXN]; key[0]=(' ')^(h[m2[0]]*16+h[m2[1]]); for(int j=1; j<N+1; ++j){ int a=16*h[m1[2*j-2]]+h[m1[2*j-1]]; int b=16*h[m2[2*j]]+h[m2[2*j+1]]; key[j]=(a)^(b)^(key[j-1]); } for(int j=0; j<N+1;++j) printf("%02X",key[j]); return 0; } thnks ^_^ I don't think there is something wrong, may be U just enlarge your array. here is test #6: 166DA60DB0D29CD2B6F51EEF245D027F0958F778E12533C7F2806E073724FE7B4E5F486B05D0F99E295B9B575AB37293A643219A228FDB8CD62B55F418586E1A2C58F3B410A8362B1BF594B20DE8628924DE63867948239A36F0159F6A217C1D6E692D97 0FDACE42A6B205B7AB71398E501C4F11FA389936B667EED607D681F1580487C95E96A93052AABE823C49DFE706DFD73A3248AF962A15DC868B5DF36A30C371B2896D26E04222E06C3FE2A8FA2E37178E8F6980DEC18D107AE09D902CEF73BCA79E5E25A221 I think I know whats your problem (cause it was mine too) your first and second letter of output should be capital and the answer must be: 2FE340A40F0DDAF1884F8313AC9486951021E021EF69A24787A3A23D6251F2C5E038CEB68F204E3597F7730F5EDBBFF756B854E35364376A6DE63E01C51E37EB78394754A290D882966F325CC0FA05E9EFA2FC4106F2AAF38922427B0B128F54D7E7AB2492 printf with "%02X" instead of "%2X" input1 : 05 26 2C 52 69 14 3F 31 4C 2A 69 65 1A 26 4B input2 : 61 07 28 41 3B 63 07 2C 52 22 21 69 72 0B 42 5E answer : 41 43 4D 20 49 43 50 43 20 4E 45 45 52 43 27 32 (P.S : I put the spaces only for that is easy to read && understand) Why is first 2 bytes in answer is 41...? Cuz, 61h xor 20h = 41h (20h -> 32d = ' ' = Space); How to find the second,third,...? 41h xor 05h = 44h 44h xor 07h = 43h(Second 2 bytes); 43h xor 26h = 65h 65h xor 28 = 4Dh (Third 2 bytes); Last some tips: if you use algos for convert from Dec to Hex be careful; your algo should convert 1 : 0d to 00h (not to 0h); 2 : 5d to 05h (not to 5h); GoodLuck!!! ;-) Edited by author 17.05.2009 08:41 I checked my program, and I'm pretty sure that it gives the correct answers for the sample input/output, and for all the tests given on this forum. I also went to the page of NEERC 2002 and downloaded their test examples, and everything seems to be correct. I tried ending output with or without a newline('\n'), and I still can't figure out why I could possibly be getting a wrong answer three times in a row. Please give me some advice as to where my problem is. Maybe it is someting small? Maybe I misread something in the problem statement? Anyway, here's my program(I'm sure the code is pretty bad, but keep in mind that I don't have much experience with these sorts of problems): #include <iostream> #include <iomanip> using namespace std; int main() { int A[10002]; long int pos = 0;
cin.unsetf(ios::skipws);
do { char input[3];
cin >> input[0];
if(input[0] == '\n') break;
cin >> input[1];
input[2] = 0;
A[pos] = (int) strtol(input, (char **) input + 2 * sizeof(char), 16); pos++;
} while(1);
int current; int key;
char input[3]; input[0] = 'C'; input[1] = '9'; input[2] = 0;
cin >> input[0] >> input[1]; key = (int) strtol(input, (char **) input + 2 * sizeof(char), 16); key ^= 32;
for(int i = 0; i < pos; i++) { cout << hex << uppercase << setfill('0') << setw(2) << key;
cin >> input[0] >> input[1];
current = (int) strtol(input, (char **) input + 2 * sizeof(char), 16);
key = ((key) ^ (A[i])) ^ (current); }
cout << hex << uppercase << setfill('0') << setw(2) << key << "\n";
return 0; } Please help! Any advice will be appreciated! The percentage AC said that. Only 200 people AC this just because they are scare of the huge Text. Yes. Very easy after you understand it. Please, send to snipious@mail.ru!!! I think the problem is easy, but I cannot understand it!!! В ближайшем будущем любое исследование и публикация о криптографии будет вне закона повсюду в мире национальных организаций безопасности. Причина для этого ясна и широко принята всеми правительствами - если литература по криптографии будет публичной как раньше, то все (даже преступники и террористы) смогут легко использовать ее для скрытия их злонамеренных планов против национальной и международных сил безопасности. Следовательно, публичные алгоритмы по криптографии и системы перестанут существовать и все кому нужна мощная защита для их секретов вынуждены будут изобретать собственные алгоритмы. Корпорация ACM имеет множество участников которые стремятся изучить его торговые секреты (-хз, бред какой-то, но вроде так )). Более того, работа для защиты их секретов осложнена тем фактом, что они вынуждениы использовать межконтинентальные линии связи которые легко подслушать, в отличии от внутренних линий АСМ которые хорошо защищены. Поэтому, АСМ изобрела Межконтинентальный Криптографический Защитный Код (ICPC) , которым они очень гордятся, и который считается неуязвимым - никто даже не пытался взломать его еще, но это может изменится. Группа хакеров была нанята соперничающей компанией, которая не раскрывает свое имя им, чтобы взломать код ICPC. Первым делом, они подкупили одного из программистов который написал программиное обеспечение для ICPC и изучал как ICPC работает. Оказалось, что ICPC использует очень большой ключ который есть последовательность битов сгенерированных каким-то сложным и случайным физическим процессом. Этот ключ менятся каждую неделю и используется для зашифровки всех сообщений которые посылаются через межконтинентальные линии связи в течении этой недели. Этот программист также гордо сказал им, что ICPC это самый быстрый код в мире, потому что (благодаря очень высокой сложности генерации кода) они просто выполняют побитовое исключающее ИЛИ (XOR) между битами сообщения и ключа. То есть, i-тый бит зашифрованного сообщения Ei = Ki XOR Ci, где Ki это i-тый бит ключа и Ci это i-тый бит исходного сообщения. Изуча принцип работы ICPC, они начали искать путь получать ключ каждую неделю, который есть единственная вещь которая недостает им для прослушивания всех межконтинентальных коммуникаций корпорации АСМ. (прослушивание межконтинентальных линий тогда становится легкой задачей) Попытка подкупить охрану ключа провалилась, поскольку охранников (которые имели одну из самых высокооплачиваемых профессий на тот момент) было очень дорого подкупить! В поисках альтернативных решений , они натолкнулись на клерка, который отправлял недельные газеты различным работникам и депортаментам. К счастью, эти газеты были посланы сразу после изменения ключа и сообщения обычно достаточно длинные для получения существенных частей ключа путем изучения оригинальных газеит и их зашифрованного кода. Однакно, они не могли найти кого-то, кто бы раскрыл содержание газеты на неделю, потому что все рабочие были ограничены Соглашением о неразгланеии (NDA) и штраф за разглашение любого сообщения это смерть. Кроме того они смогли убедить этого клерка (за небольшую плату) сделать на вид невинную вещь : пока отсылаются копии газеты в корпорацию, ему нужно вставить несколько дополнительных пробелов в начало некоторых сообщений, но послать также другие копии в их оригинальном виде. Теперь задача получения ключа становится простой и это для тебя, ты создашь программу для этого. Программе даны два ICPC сообщения, где длина первого - N битов, длина второго N + 1 битов , и второе является зашифровкой такого же сообщения как первое, но с одним дополнительным пробелом (который представлен битом с кодом 32) в начале. Программа должна найти первые N+1 битов ключа который используется для зашифровки сообщений. Фух блин запарило, целый роман написали) Спасибо огромное!!! thank you very much! :))) In the task said "The first line consists of 2N characters and represents the encoded message N bytes long". But I understood that if we encode the message length of n, we will receive message the same length (n). Whats wrong? Each byte can be presented as 2 characters in a hexadecimal form 0 - 00 1 - 01 .. 16 - 10 .. 255 - FF so n bytes = 2*n characters Thank you! Now I'll try to solve it! In this problem restrictions 1 <= N <= 10000, but length of message can be 2 * N. So if you have CRASH on test 8, just try to increase length of your arrays... how it is possible? program work on 1-st,2nd, 3th and 4th tests, but on test #5 it gives WA?! plase help me! my program: [code deleted by autor.] Edited by author 04.10.2006 09:59 Try this 32 0AC9 Your answer: 0A and two spaces Right answer: 0AC9 And this AA AAAA Your answer has only spaces, and the real answer is 8A8A!) Good Luck! Edited by author 03.10.2006 20:49 Try this 32 0AC9 Your answer: 0A and two spaces Right answer: 0AC9 Right answer: 2AD1. However, thank you. I found my mistake. t must be unsigned char. There is Access violation if t - char. It's an easy problem, but... Please, some tests with answers. Oh, damn!!! I used integer exept longint! A stupid mistake but... The text is so long that I can't understand it. |
|