POJ-1026 Cipher 置换群
题目链接:http://poj.org/problem?id=1026
简单的置换题目,求出置换群后直接取余即可。
1 //STATUS:C++_AC_32MS_308KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector> 10 #include<queue> 11 #include<stack> 12 #include<map> 13 using namespace std; 14 #define LL long long 15 #define pii pair<int,int> 16 #define Max(a,b) ((a)>(b)?(a):(b)) 17 #define Min(a,b) ((a)<(b)?(a):(b)) 18 #define mem(a,b) memset(a,b,sizeof(a)) 19 #define lson l,mid,rt<<1 20 #define rson mid+1,r,rt<<1|1 21 const int N=210,INF=0x3f3f3f3f,MOD=40001,STA=8000010; 22 const double DNF=1e13; 23 24 int c[N],f[N][N],vis[N]; 25 int n,k,cnt; 26 27 int main() 28 { 29 // freopen("in.txt","r",stdin); 30 int i,j,lens,r,t,u,w; 31 char s[N],ans[N]; 32 while(~scanf("%d",&n) && n) 33 { 34 cnt=0; 35 mem(vis,0); 36 for(i=1;i<=n;i++){ 37 scanf("%d",&c[i]); 38 f[i][0]=0; 39 } 40 41 for(i=1;i<=n;i++){ 42 if(!vis[i]){ 43 f[cnt][0]=0; 44 u=i; 45 while(!vis[u]){ 46 vis[u]=1; 47 f[cnt][++f[cnt][0]]=u; 48 u=c[u]; 49 } 50 cnt++; 51 } 52 } 53 54 while(scanf("%d",&k) && k){ 55 getchar(); 56 gets(s); 57 lens=strlen(s); 58 while(lens<n)s[lens++]=' '; 59 s[lens]=0; 60 for(i=0;i<cnt;i++){ 61 t=f[i][0]; 62 r=k%t; 63 for(j=1;j<=t;j++){ 64 w=((j+r)%t>0?(j+r)%t:t); 65 ans[f[i][w]-1]=s[f[i][j]-1]; 66 } 67 } 68 ans[n]=0; 69 printf("%s\n",ans); 70 } 71 putchar('\n'); 72 } 73 return 0; 74 }