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;
}