Cipher-----置换

题目:http://poj.org/problem?id=1026

    另:http://acm.hdu.edu.cn/showproblem.php?pid=1439

题解:求出经过k次置换后,str[i]的位置。

代码:

#include <stdio.h>
#include <string.h>

int m,n,len,k;
char str[205],s[205];
int a[205],t[205];    //t记录i的循环长度
int v[205];

void solve()           //求出循环长度
{
 int x=0,k=1,j;
 for(int i=1;i<=n;i++)    {  v[i]=0;  t[i]=0; }
 for(int i=1;i<=n;i++)
 {
     if(v[i]==0)
     {
         v[i]=k;
         j=a[i];
         x=1;
         while(i!=j)
         {
            v[j]=k;
            x++;
            j=a[j];
         }
     }
     t[k]=x;
     k++;
 }
}
int ok(int i)          //返回字符串str的i处在新的字符串的位置
{
   int  m,j,x=0;
   m=k%t[v[i]];
    j=i;
   while(x<m)
   {
     j=a[j];
     x++;
   }
   return j;
}
int main()
{
 // freopen("/home/wk/in.txt","r",stdin);
  while(1)
  {
      scanf("%d",&n);
      if(n==0)
      break;
      memset(a,0,sizeof(a));
      for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
      solve();
      while(1)
      {
          scanf("%d",&k);
          if(k==0)
          break;
          getchar();
          gets(str);
          len=strlen(str);
       //   printf("%d\n",len);
          if(len<n)
          {
              for(int i=len;i<n;i++)
               str[i]=' ';
          }
       //   for(int i=n-1;i>=0;i--)
        //  printf("%c",str[i]);
       //   printf("\n");

          for(int i=1;i<=n;i++)
           s[ok(i)-1]=str[i-1];
           s[n]='\0';
          printf("%s\n",s);
      }
      printf("\n");
  }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值