当前位置: 代码迷 >> 综合 >> poj-1026-Cipher-置换群
  详细解决方案

poj-1026-Cipher-置换群

热度:11   发布时间:2023-12-19 10:56:55.0

寻找置换群,然后找出置换后的序列。

#include <stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<stack>
#include<vector>
#define LL __int64
#define maxn 501
using namespace std;
int a[maxn];
int vis[maxn];
char str[maxn];
char ansstr[maxn];
int num,n;
void init()
{int x;for(int i=1; i<=n; i++){scanf("%d%*c",&x);a[x]=i;}
}
void chustr()
{int i,j;int len=strlen(str);num=0;for(i=0; i<len; i++){if(str[i]!=' ')num=num*10+str[i]-'0';else break;}i++;for(j=i; i<len; i++){str[i-j+1]=str[i];}for(i=len-j+1; i<=n; i++)str[i]=' ';
}
void dos()
{vector<int>vec;int i,j;int nums;for(i=1; i<=n; i++){if(vis[i])continue;vec.clear();j=i;nums=0;vec.clear();while(!vis[j]){vis[j]=1;vec.push_back(j);j=a[j];nums++;}nums=num%nums;int lens=vec.size();for(j=0; j<lens; j++){ansstr[vec[j]]=str[vec[(j+nums)%lens]];}}
}
void print()
{for(int i=1; i<=n; i++)cout<<ansstr[i];cout<<endl;
}
int main()
{int i,j;while(scanf("%d%*c",&n)&&n){init();while(gets(str)){if((strlen(str)==1)&&str[0]=='0')break;chustr();dos();memset(vis,0,sizeof(vis));print();}cout<<endl;}return 0;
}