题目大意:

给定了一组对应关系,经过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. poj 1201 Intervals【差分约束+spfa】

    设s为前缀和,首先显然的条件是\[ s_{bi}-s_{ai-1}>=c \],然后隐含的是\[ s_i-s_{i-1}>=0 s_i-s_{i-1}<=1 \] 然后根据差分约束, ...

  2. 基于.Net Core的API框架的搭建(2)

    4.加入数据库支持 下面我们为项目加入数据库支持,修改appsettings.json: 然后我们要生成实体类,打开VS工具->NuGet包管理器->程序包管理器控制台: 输入命令: Sc ...

  3. 对mysql修改库里面所有的引擎mysaim 为 innodb

    1.查看当前数据引擎的命令: show engines; 2. USE `[DBNAME]`; SELECT GROUP_CONCAT(CONCAT( 'ALTER TABLE ' ,TABLE_NA ...

  4. 树形DP Gym 100496H House of Representatives

    题目传送门 /* 题意:寻找一个根节点,求min f(u) = ∑ρ(v, u) * p(v).ρ(v, u)是u到v的距离,p(v)是v点的权值 树形DP:先从1出发遍历第一次,sum[u]计算u到 ...

  5. Android 性能优化(24)*性能工具之「Traceview,dmtracedump」Profiling with Traceview and dmtracedump :记录并查看函数调用栈*

    Profiling with Traceview and dmtracedump In this document Traceview Layout         Traceview工具界面介绍 T ...

  6. js计算每月的天数

    function getDaysOfMonth(year, month) { month = parseInt(month); switch (month) { case 1: case 3: cas ...

  7. Java 8 (8) 默认方法

    传统上,Java程序的接口是将相关方法按照预定组合到一起的方式.实现接口的类必须为接口中定义的方法提供一个实现,或者从父类中集成它的实现.但是,一旦类库的设计者需要更新接口,向接口中加入新的方法时候, ...

  8. 对比hive和mysql 复杂逻辑流处理

      1.Mysql中可用存储过程和函数来实现复杂逻辑处理,两者的对比如下:存储过程作为可执行文件,编译一次放在数据库中,函数又返回值.可设定使用权限. 存储过程中可使用游标,声明变量.用call调用. ...

  9. 【译】x86程序员手册31- 第9章 异常和中断

    Chapter 9 Exceptions and Interrupts 第9章 异常和中断 Interrupts and exceptions are special kinds of control ...

  10. 2-2 列表推导同 filter 和 map 的比较

    列表推导同 filter 和 map 的比较 参考廖雪峰的文档: filter()函数:用于过滤序列. filter()接收一个函数和一个序列.把传入的函数依次作用于传入的序列的每个元素,根据返回值是 ...