POJ1026 HDU1439 Cipher

原创 2012年03月23日 19:49:06

置换群

根据经验,如果直接模拟的话,必定超时。我们假设对于第i位字符,经过ri次置换后,又回到第i位上,可知2ri,3ri等等过后也会再次回到第i位,我们把ri称为一个周期。如果我们求得每一位的周期,就可以很方便的求得第k次置换后的结果必然与k%ri的结果一样。


/*******************************************************************************
 # Author : Neo Fung
 # Email : neosfung@gmail.com
 # Last modified: 2012-03-23 19:46
 # Filename: POJ1026 HDU1439 Cipher.cpp
 # Description : 
 ******************************************************************************/
#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
#define MAX 1100
using namespace std;

int num[MAX],array[MAX][MAX],order[MAX];
char input[MAX],output[MAX];

void func(const int &n)
{
  memset(order,0,sizeof(order));
  for(int i=0;i<n;++i)
    array[0][i]=i;
  int tmp=n;
  int ind=1;
  while(tmp)
  {
    for(int i=0;i<n;++i)
      if(!order[i])
        array[ind][num[i]]=array[ind-1][i];
    for(int i=0;i<n;++i)
      if(!order[i] && array[ind][i]==array[0][i])
      {
        order[i]=ind;
        --tmp;
      }

      ++ind;
  }
}

int main(void)
{
#ifdef DEBUG  
  freopen("../stdin.txt","r",stdin);
  freopen("../stdout.txt","w",stdout); 
#endif  

  int n,k;

  while(scanf("%d",&n) &&n)
  {
    // 		memset(num,-1,sizeof(num));
    for(int i=0;i<n;++i)
    {
      scanf("%d",&num[i]);
      --num[i];
    }

    func(n);

    while(scanf("%d",&k) && k)
    {
      getchar();
      gets(input);
      for(int i=strlen(input);i<n;++i)
        input[i]=' ';
      memset(output,' ',sizeof(output));
      for(int i=0;i<n;++i)
      {
        output[i]=input[array[k%order[i]][i]];
      }
      output[n]='\0';
      puts(output);
    }

    printf("\n");
  }

  return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj 1026 Cipher(置换群循环节)

Cipher 点击打开题目链接 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1957...

POJ 1026 - Cipher【置换群】

Cipher Time Limit: 1000MS Memory Limit: 10000KB Description: Bob and Alice started to use a brand-ne...

poj 1026 Cipher(置换群T_T)

跪了一个下午了,才发现在循环哪里写错了WA到死。 题目意思是: 10 4 5 3 7 2 8 1 6 10 9 1 Hello Bob 1995 CERC 0 0 给出了一个长为...
  • cqlf__
  • cqlf__
  • 2012年08月27日 17:42
  • 1186

POJ 1026 Cipher 置换群

题目大意就是 给出1~n的置换序列, 然后给出一个整数k,和一个串 问置换k次后的串是什么样子的。 首先,给出的串的长度是小于等于n的,不足的位置要补上空格。 然后置换k次,不是直接就循环着置...

POJ 1026-Cipher(置换群)

题目地址:POJ 1026 题意:给一个字符串加密,如果字符串长度不够n,那么对字符串补空格,一直到n。给你n个数字代表加密方式,i位置的字母将被写到加密信息的ai位置,如此反复加密k次,让你求最后...

【POJ 1026】Cipher(置换群)

铅华褪却,听远方涛声拍岸

poj 1026 Cipher(置换)

http://poj.org/problem?id=1026 大致题意:给出数字n和一个1~n的序列num[]。然后给出若干个字符串,让字符串的下标i和num[i]交换,问交换K次后得到的字...

POJ 1026 Cipher(置换)

Cipher Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19502   Accepted: 5239...

poj1026 Cipher (循环节)

poj1026 Cipher (循环节) Bob and Alice started to use a brand-new encoding scheme. Surprisingly it is no...

POJ 1026 Cipher

继续来置换,这次的题也是很简单的。 题目大意: 对于一个长度为n的字符串,有一个数组表示第i个字符放到那个位置。 输入多个字符串,问这样操作k次后的字符串是什么样子的。 解题思路: 对于每一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ1026 HDU1439 Cipher
举报原因:
原因补充:

(最多只允许输入30个字)