Poj 1026
本来以为是一道简单的置换水题,结果被poj狠狠打脸了。我错了,poj没有水题。
总之就是置换……计算循环节……然后注意输入输出……心累不想多说了看代码吧
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<stdio.h> 5 using namespace std; 6 7 const int MAXN=205; 8 9 char str[MAXN]; 10 char ans[MAXN]; 11 bool marked[MAXN]; 12 int n; 13 int k; 14 int m; 15 int key[MAXN]; 16 int num[MAXN]; 17 int change[MAXN][MAXN]; 18 19 void cipher(){ 20 memset(marked,false,sizeof(marked)); 21 m=0; 22 for(int i=1;i<=n;i++){ 23 if(!marked[i]){ 24 num[m]=0; 25 marked[i]=true; 26 int temp; 27 temp=key[i]; 28 change[m][num[m]++]=temp; 29 while(!marked[temp]){ 30 marked[temp]=true; 31 change[m][num[m]++]=key[temp]; 32 temp=key[temp]; 33 } 34 m++; 35 } 36 } 37 } 38 39 int main(){ 40 //freopen("out.txt","w",stdout); 41 cin>>n; 42 while(n!=0){ 43 for(int i=1;i<=n;i++){ 44 cin>>key[i]; 45 } 46 cipher(); 47 cin>>k; 48 while(k!=0){ 49 memset(str,0,sizeof(str)); 50 gets(str); 51 int len=strlen(str); 52 for(int i=len;i<=n;i++){ 53 str[i]=' '; 54 } 55 str[n+1]='\0'; 56 for(int i=0;i<m;i++){ 57 for(int j=0;j<num[i];j++){ 58 ans[change[i][(j+k)%num[i]]]=str[change[i][j]]; 59 } 60 } 61 ans[n+1]='\0'; 62 63 for(int i=1;i<=n;i++){ 64 cout<<ans[i]; 65 } 66 cout<<endl; 67 68 //printf("%s\n",ans+1); 69 cin>>k; 70 } 71 cout<<endl; 72 cin>>n; 73 } 74 }