| Felix Halim .NET | ||||||||
|
University Experience
IOI 2002 Yong In, Korea
ACM ICPC Regional Manila 2003
ACM ICPC Regional Manila 2004
ACM ICPC Regional Manila 2005
ACM ICPC Regional Kaohsiung 2006
ACM ICPC Regional Singapore 2007
ACM ICPC World Final Tokyo 2007
Google India Code Jam 2005
Google India Code Jam 2006
Indonesia National Contest 2007
Indonesia National Contest 2008
|
||||||||
Problem D - Email from the ProfessorComplete Problem Statement hereDiberikan string plaintext, dan sebuah key untuk meng-enkripsi-nya. Cara meng-enkripsi plaintext tersebut adalah dengan me-wrap around plaintext dengan width K (sehingga tercipta K columns of characters dan R baris). Lalu pengkodeannya adalah dengan membaca column (a1,a2,a3..aK) dari baris paling atas ke paling bawah dimana a1..aK adalah permutasi dari 0..K-1. Soal ini hanya men-simulasikan apa yang ada di soal, jadi pintar-pintarnya kalian membuat program tanpa bug. Algoritmanya simple, anda cukup melakukan inverse dari key yang diberikan, lalu tinggal anda print per kolom dari baris pertama sampai terakhir, tetapi hati-hati dengan baris terakhir, bisa jadi sudah melebihi panjang string inputnya. Untuk lebih jelasnya lihat source code dibawah.
#include <stdio.h>
#include <string.h>
int idx[1000], inv[1000];
char s[1001];
int main(){
while (gets(s)){
int i,j,k,row,len=strlen(s);
scanf("%d",&k);
for (i=0; i<k; i++)
scanf("%d",&idx[i]);
scanf("\n"); // baca ending new line
for (i=0; i<k; i++)
inv[idx[i]-1] = i; // inverse idx, tampung di inv
row = (len+k-1)/k; // berapa baris yang tercipta, dibulatkan keatas
for (i=0; i<k; i++) // looping pertama, untuk setiap kolum dari 0..k-1
for (j=0; j<row; j++){ // looping kedua, print dari baris atas sampai bawah
if (inv[i]<len) // hati hati, cek apakah index sekarang melebihi input?
printf("%c",s[inv[i]]);
inv[i] += k; // lanjutkan ke baris berikutnya
}
puts("");
}
}
Lihat problem lain:
|
||||||||