Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19570 | Accepted: 5260 |
Description
The length of the message is always less or equal than n. If the message is shorter than n, then spaces are added to the end of the message to get the message with the length n.
Help Alice and Bob and write program which reads the key and then a sequence of pairs consisting of k and message to be encoded k times and produces a list of encoded messages.
Input
Output
Sample Input
10 4 5 3 7 2 8 1 6 10 9 1 Hello Bob 1995 CERC 0 0
Sample Output
BolHeol b C RCE
Source
题意:给一个n元置换,给一个字符串(若小于n则用空格补齐),求k次置换后的字符串
输入包含多个块,输出时每个块后加个空行;
注意:不要直接进行k次置换,肯定超时;
先预先处理置换群,找循环节,并储存,然后,对于每个循环节内的字符串,只要进行k%(此循环节的长度)次即可;
代码:
#include <iostream>
#include <vector>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <stack>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define N 210
using namespace std;
int a[N];
int m[N][N];///m[i][0]表示第i个循环节的元素的个数,m[i][j]表示第i个循环节内的第j-1个元素;
int nodecnt;
void translate(char ss[],int n,int k)
{
int i,j,k1;
char s[N];
strcpy(s,ss);
for(i=0; i<nodecnt; i++)
{
int d=k%(m[i][0]);
for(j=0; j<d; j++)
{
for(k1=1; k1<=m[i][0]; k1++)
{
ss[a[m[i][k1]]]=s[m[i][k1]];
}
strcpy(s,ss);
}
}
}
void find_node(int n)
{
bool visit[N];
int i,j;
nodecnt=0;
memset(visit,0,sizeof(visit));
for(i=0; i<n; i++)
{
if(visit[i])
continue;
visit[i]=1;
m[nodecnt][0]=1;
m[nodecnt][1]=i;
for(j=a[i]; j<n; j=a[j])
{
if(j==i)
break;
visit[j]=1;
m[nodecnt][m[nodecnt][0]+1]=j;
m[nodecnt][0]++;
}
nodecnt++;
}
}
int main()
{
char ss[N];
///freopen("output.txt","w",stdout);
int n,k,i,slen,cnt=0;
while(~scanf("%d",&n)&&n)
{
memset(ss,'\0',sizeof(ss));
memset(m,0,sizeof(m));
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
a[i]-=1;
}
find_node(n);///找寻环节
while(~scanf("%d",&k)&&k)
{
getchar();
gets(ss);
slen=strlen(ss);
while(slen<n)
{
ss[slen++]=' ';
}
translate(ss,slen,k);
printf("%s\n",ss);
memset(ss,'\0',sizeof(ss));
}
printf("\n");
}
return 0;
}