题目大意:

给定了一组对应关系,经过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. CSS布局大全

    前几天面试,问我某布局感觉回答不是很OK所以研究了一下各种布局. 一.单列布局 1.普通布局(头部.内容.底部) <div class="container"> < ...

  2. UVa 101 - The Blocks Problem STL

    题目:给你n个方块,有四种操作: .move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面: .move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上 ...

  3. DHTML_____window对象的事件

    <html> <head> <meta charset="utf-8"> <title>window对象事件</title&g ...

  4. java https客户端请求

    String pathname = Test3.class.getResource("/client.jks").getFile(); System.out.println(pat ...

  5. 树莓派 关闭屏保 / RaspberryPi turn off ScreenSaver / RaspberryPi disable screen off

    安装xscreensaver并配置 见:https://www.raspberrypi.org/forums/viewtopic.php?t=57552

  6. Intellij使用心得(四) -- 导入Eclipse的代码格式化文件

    https://my.oschina.net/flashsword/blog/137598

  7. MVC之参数验证(一)

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其数据的准确性.总地来说,我们可以采用Syste ...

  8. IFormattable,ICustomFormatter, IFormatProvider接口

    定                 义 1.IFormattable   提供一种功能,用以将对象的值格式化为字符串表示形式. 2.IFormatProvider  提供用于检索控制格式化的对象的机制 ...

  9. Redis作者:深度剖析Redis持久化

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...

  10. IDEA 提示Cannot resolve symbol

    将Springboot项目,构建为多个模块的时候,idea的有些类中报错Cannot resolve symbol 解决: 1.File->Invalidate Caches/Restart 清 ...