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 }

 

posted @ 2017-06-15 17:27  水野玛琳  阅读(131)  评论(0编辑  收藏  举报