poj 1026 Cipher

// poj 1026 Cipher
/*

   一直超时,到后来才发现其实很简单,但是代码已经写得很乱了。
   主要是预处理一下,对于每一个i上的字符加密一定次数后,结果会构成一个
   循环,也就是回到i的位置,如果我们求出这个循环周期,并把路径记录下来,
   那么就可以使用取余运算确定最终第i个字符的位置了。
*/

#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1<<29;
int n,k;
int input[201];
int a[2][201];
char str[210],temp[210];
int ans[210][210];
int mark[210];
void cal() //预处理,主要是要观察到其循环性
{
 memset(mark,0,sizeof(mark));
    int c=1,sum=0;
 for (int i=1;i<=n;i++) { a[1][i]=i;ans[i][0]=0;}
    while (sum<n)
    {
        for (int i=1;i<=n;i++)
  {
   int j=a[c][i];
   a[c^1][input[i]]=j;
   if (!mark[j]) {
    ans[j][++ans[j][0]]=input[i];
    if (input[i]==j) {
     mark[j]=1;
     ++sum;
    }
   }
  }
        c^=1;
    }
}


int d[210];
void solve()
{
 
 for (int i=1;i<=n;i++)
  if (k%ans[i][0]==0) d[i]=i;
  else d[i]=ans[i][k%ans[i][0]];

}
int main()
{
    while (scanf("%d",&n) && n)
    {
          for (int i=1;i<=n;i++) scanf("%d",&input[i]);
    cal();
   
          while (scanf("%d",&k) && k)
          {
              gets(str);
              int len=strlen(str+1);
              for (;len<n;++len) str[len+1]=' ';
             
              solve();
              for (int i=1;i<=n;i++)
    temp[d[i]]=str[i];
              temp[n+1]=0;
              printf("%s/n",temp+1);
          
          }
          printf("/n");
    }
    system("pause");
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值