📄 1439 cipher.cpp
字号:
//ACM暑期集训队练习赛(5)1001 Cipher
#include<iostream>
#include<string>
#include<memory>
using namespace std;
const int N=201;
int main()
{
int key[N]; //secret kay
int keys[N]; //group information
char ct[N]; //CipherText
bool used[N];
int cycle[N][N];
int n;
while(cin>>n,n>0)
{
for(int i=0;i<n;i++)
cin>>key[i];
memset(used,0,sizeof(used));
int x=0;
int idxc=0;
while(x<n)
{
if(used[x])
{
x++;
continue;
}
else
{
used[x]=true;
int mark=x;
int len=1;
cycle[idxc][len]=key[x];
while(key[x]!=mark+1)
{
len++;
x=key[x]-1;
used[x]=true;
cycle[idxc][len]=key[x];
}
cycle[idxc][0]=len;
for(int i=1;i<=len;i++)
keys[cycle[idxc][i]-1]=idxc;
x=mark;
idxc++;
}//if
x++;
}//while
int m;
while(cin>>m,m>0)
{
char ch;
cin.get(ch);
int idx=0;
while(cin.get(ch),ch!='\n')
ct[idx++]=ch;
for(int i=idx;i<n;i++)
ct[i]=' ';
char it[N];//intertext;
memset(used,0,sizeof(used));
x=0;
while(x<n)
{
if(used[x])
{
x++;
continue;
}
int mark=keys[x];
int step=m%cycle[mark][0];
int pi=1,pj=pi+step;
for(int i=0;i<cycle[mark][0];i++)
{
used[cycle[mark][pj]-1]=true;
it[cycle[mark][pj]-1]=ct[cycle[mark][pi]-1];
pi++;pj++;
if(pj==cycle[mark][0]+1)
pj=1;
}
x++;
}//while x
it[n]='\0';
cout<<it<<endl;
}
cout<<endl;
}//while
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -