ЗигЗаг

Энэ шифр нь аль ч байрлал дахь үсэг өндөр болох К-аас хамаарч тогтмол нэг байрлалд очдог онцлогтой. Тэгэхээр өгөгдсөн текстийн -р байрлал дахь үсэг ямар байрлалд очихыг олцгооё. Үүний тулд үгийн урттай ижил урттай хүснэгтийг ЗигЗаг шифрээр шифрлэе. Энэ нь өгөгдсөн текстийн үсгийг нь биш үсгийн индексийг шифрлэж байгаа хэрэг юм. Бодлогын жишээнд ба гэсэн текст өгөгдсөн. Одоо өгөгдсөн текстийг урттай ижил урттай индекс хадгалсан хүснэгт үүсгэе. Одоо үүссэн хүснэгтээ өндөртэйгээр шифрлэе.


гээд зайг нь шахаад:


болно. Эцэст нь бүх мөрийг нь ард ардаас нь залгаж бичвэл болно. Уг хүснэгтийг гэж нэрлэе. Энэ үүссэн хүснэгт маань өгөгдсөн текстийн -р байрлал дахь үсэг -р байрлалд очихыг илэрхийлнэ. Тэгэхээр жишээ өгөгдлийн хариу нь болж байна.

Код

#include <vector> #include <string> #include <iostream> using namespace std; string str, ans; vector <int> vec[1000005]; int main() { int k; cin >>k >> str; int n = str.length(); int x = 0, y = 0, d = 1; for(int i = 0; i < n; i++) { vec[x].push_back(i); if(x == k - 1) d = -1; if(x == 0) d = 1; x += d; } ans = str; for(int i = 0; i < k; i++) for(int j = 0; j < vec[i].size(); j++) { ans[vec[i][j]] = str[y++]; } cout << ans << endl; return 0; }