Saturday 21 March 2009

POJ ( acm.pku.edu.cn ) 1026




#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
//void encode ( char* in, char* out, int* key, int len, int k) {
// for (;k;--k){
// for (int i=0;i<len;++i) {
// out[key[i]]=in[i];
// }
// swap(in,out);
// }
// swap(in,out);
//}

char* encode(char* in, char* out, int* key, int len, int k) {
for (int i=0;i<len;++i){
int n,c,a;
for(n=1,c=key[i];c!=i;c=key[c])++n;
for(c=i,a=k%n;a;--a)c=key[c];
out[c]=in[i];
}
return out;
}

int main() {
for (int N;cin>>N&&N;){
int key[256];
for(int i=0;i<N;++i) {
cin>>key[i];
--key[i];
}
for(int k;cin>>k&&k>0;){
cin.get();//space
char msg[256],enmsg[256]={0}; cin.getline(msg,256);
int l=strlen(msg);
for(;l<N;++l)msg[l]=' ';
msg[l]=0;
encode(msg,enmsg,key,N,k);
cout<<enmsg<<endl;
}
cout<<endl;
}
return 0;
}


之后,为了避免重复计算,我这么改进了:


#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

class encoder {
int* key;
int len;
int circle_len[256];
encoder();
encoder(encoder const&);
public:
encoder(int *key, int len):key(key),len(len){calc_circle();}
~encoder(){delete[] circle_len;}
void calc_circle() {
for (int i=0;i<len;++i){
int n,c;
for(n=1,c=key[i];c!=i;c=key[c])++n;
circle_len[i]=n;
}
}
char* operator()(char* in, char* out, int k){
for (int i=0;i<len;++i){
int c,a;
for(c=i,a=k%circle_len[i];a;--a)c=key[c];
out[c]=in[i];
}
return out;
}
};


int main() {
for (int N;cin>>N&&N;){
int key[256];
for(int i=0;i<N;++i) {
cin>>key[i];
--key[i];
}
encoder encode(key, N);
for(int k;cin>>k&&k>0;){
cin.get();//space
char msg[256],enmsg[256]; cin.getline(msg,256);
int l=strlen(msg);
for(;l<N;++l)msg[l]=' ';
msg[l]=enmsg[l]=0;
encode(msg,enmsg,k);
cout<<enmsg<<endl;
}
cout<<endl;
}
return 0;
}

——结果是戏剧性的 Runtime Error

No comments:

Post a Comment