题目大意:

给定了一组对应关系,经过k次幂后,得到新的对应关系b[i],然后将给定的字符串上的第i位字符放置到b[i]的位置上,

如果字符串长度不足n就用空格补足,这里的是空格,也就是str[i] = ' ',不是str[i]='\0' ,自己这里错了好几回就是找不到问题,看了别人代码才明白

置换群的k次幂问题不清楚,可以看看<<置换群快速幂运算+研究与探讨.pdf>>

这里初始给定的置换群要注意这个群不一定是一个循环集,我们要先统计出它的每一个循环集,然后每一个分别进行操作计算

 #include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
//qun[i]保存第i个循环集的第一个数,a[]表示原映射,b[]表示k次幂后得到的新的对应关系,cnt表示循环集的个数
int a[N] , b[N] , tmp[N] , tmp_new[N] , qun[N] , vis[N] , cnt;
char str[N]; void circle(int u)
{
qun[cnt] = u;
int v = u;
while(u != a[v]){
vis[v] = ;
v = a[v];
}
vis[v] = ;
cnt++;
}
//返回当前循环集的长度
int get_tmp(int cnt)
{
int index = ;
tmp[index++] = qun[cnt];
// cout<<"here: "<<cnt<<" start: "<<qun[cnt]<<endl;
int u = a[qun[cnt]];
while(u != tmp[]){
tmp[index++] = u;
u = a[u];
}
return index;
} int main()
{
// freopen("a.in" , "r" , stdin);
int n , k;
while(scanf("%d" , &n) , n)
{
for(int i= ; i<=n ; i++)
scanf("%d" , a+i); memset(vis , ,sizeof(vis));
cnt = ;
//初始置换群中可能有多个循环集,我们需要一个一个循环集进行操作
for(int i= ; i<=n ; i++)
if(!vis[i]) circle(i); while(scanf("%d" , &k) , k){
getchar();
gets(str+);
int len = strlen(str+);
for(int i=len+ ; i<=n ; i++)
str[i] = ' ';
// printf("%s\n" , str+1);
for(int i= ; i<cnt ; i++){
int len = get_tmp(i); int index = , pos = ;
tmp_new[index++] = tmp[]; memset(vis , , sizeof(vis));
vis[] = ;
for(int i= ; i<len ; i++){
pos = (pos+k)%len;
//分裂成了一个小循环集
if(vis[pos]){
for(int i=; i<index ; i++){
if(i <index-) b[tmp_new[i]] = tmp_new[i+];
else b[tmp_new[i]] = tmp_new[];
}
//tmp数组下标清零
index = ;
pos = (pos+)%len;
}
tmp_new[index++] = tmp[pos];
vis[pos] = ;
}
//最后一个分裂出来的循环集的映射加入到b中
for(int i=; i<index ; i++){
if(i <index-) b[tmp_new[i]] = tmp_new[i+];
else b[tmp_new[i]] = tmp_new[];
}
} char ans[N];
for(int i= ; i<=n ; i++){
ans[b[i]] = str[i];
}
ans[n+] = '\0';
printf("%s\n" , ans+);
}
puts("");
}
return ;
}

POJ 1026 置换群的k次幂问题的更多相关文章

  1. poj 1026(置换群)

    题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...

  2. poj 3070 && nyoj 148 矩阵快速幂

    poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...

  3. POJ 3415 不小于k的公共子串的个数

    Common Substrings Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9248   Accepted: 3071 ...

  4. POJ 3261 可重叠k次最长重复子串

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13127   Accepted: 5842 Ca ...

  5. BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...

  6. DNA Sequence POJ - 2778 (ac自动机 + 快速幂)

    题意: 给出患病的DNA序列,问序列长度为n的,且不包含患病的DNA序列有多少种 解析: 以给出的患病DNA序列建trie树  患病结点要用flag标记 对于长度为n的序列 位置i有四种 情况A  C ...

  7. $O(k^2)$ 求前缀 $k$ 次幂和(与长度无关)

    接下来求解前缀幂次和 求解 \(\sum_{i = 1}^{k} i^k\) \[ \begin{aligned} (p+1)^k - 1 = (p+1)^k - p^k + p^k - (p-1)^ ...

  8. POJ 1026 Cipher(置换群)

    题目链接 题意 :由n个数字组成的密钥,每个数字都不相同,都在1-n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求 ...

  9. Poj.Grids 2951 浮点数求高精度幂

    2951:浮点数求高精度幂 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个实数 R ( 0.0 < R < 99.999 ) ,要求写程序精确计算 R 的 n 次方. ...

随机推荐

  1. bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路【Floyd】

    弗洛伊德之后按序列加起来即可 #include<iostream> #include<cstdio> #include<algorithm> using names ...

  2. 每天学点Linux命令之Linux-Shell中的数据重定向与管道命令

    在Linux shell中, 数据重定向使用 > < 符号,管道命令使用 | 符号链接前后两个命令. 具体区别如下: 数据重定向 1.(>): 左侧应该有标准输出 > 右侧只能 ...

  3. 微信开发解决if...else..的臃肿

    开发中难以避免if...else (switch case ),大量的if...else 让代码可读性低...难以维护 无论是接手别人的代码还是自己写的代码,因为开发周期短可能就往往忽略了这一点. 久 ...

  4. C++(变量类型-深入)

    变量类型 变量其实只不过是程序可操作的存储区的名称.C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字 ...

  5. 【转】jvm内存结构

    JVM的基本结构 包括四部分:类加载器.执行引擎.内存区(运行时数据区).本地方法接口 类加载器:jvm启动时或类运行时将需要的class文件加载到JVM中. JVM内存申请过程如下: JVM 会试图 ...

  6. Reuse a SSL socket

    It's possible to reuse a SSL socket after proper cleanup. See SSL Socket free and shutdown on stacko ...

  7. parsley之验证属性设置

    parsley.js添加表单验证功能,直接在html元素中添加对应属性: Name API Description Required #2.0必填 required HTML5 data-parsle ...

  8. HDU_2079_(01背包)(dfs)

    选课时间(题目已修改,注意读题) Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. HDU_1175_连连看

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大意:连连看规则,只能转两次弯,先输入矩阵0表示没有棋子,正整数表示不同的棋子,然后询问,输入两点坐 ...

  10. Python orm基础

    ORM 对象映射关系程序. 通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sq ...