POJ 1026 置换群的k次幂问题
题目大意:
给定了一组对应关系,经过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次幂问题的更多相关文章
- poj 1026(置换群)
题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...
- poj 3070 && nyoj 148 矩阵快速幂
poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...
- POJ 3415 不小于k的公共子串的个数
Common Substrings Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9248 Accepted: 3071 ...
- POJ 3261 可重叠k次最长重复子串
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 13127 Accepted: 5842 Ca ...
- BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...
- DNA Sequence POJ - 2778 (ac自动机 + 快速幂)
题意: 给出患病的DNA序列,问序列长度为n的,且不包含患病的DNA序列有多少种 解析: 以给出的患病DNA序列建trie树 患病结点要用flag标记 对于长度为n的序列 位置i有四种 情况A C ...
- $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)^ ...
- POJ 1026 Cipher(置换群)
题目链接 题意 :由n个数字组成的密钥,每个数字都不相同,都在1-n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求 ...
- Poj.Grids 2951 浮点数求高精度幂
2951:浮点数求高精度幂 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个实数 R ( 0.0 < R < 99.999 ) ,要求写程序精确计算 R 的 n 次方. ...
随机推荐
- E20170610-hm
presence n. 出席; 仪表; 风度; 鬼魂,神灵; defence n. 防御; 辩护; 防御工事; 后卫; phyle n. 种族,宗族; race n. 赛跑; 民族; 人种; ...
- bzoj4890[Tjoi2017]城市(树的半径)
4890: [Tjoi2017]城市 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 149 Solved: 91[Submit][Status][D ...
- bzoj1528 sam-Toy Cars(贪心,优先队列)
「BZOJ1528」[POI2005] sam – Toy Cars Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Ja ...
- ACM_下一个排列
The Next Permutation Time Limit: 2000/1000ms (Java/Others) Problem Description: For this problem, yo ...
- 数据传递--------博客-----------springMVC源码分析--RequestToViewNameTranslator请求到视图名称的转换
参考来源:http://blog.csdn.net/qq924862077/article/details/54286976?utm_source=gold_browser_extension Req ...
- Kali Linux的介绍
Kali Linux是什么? Kali Linux是一个渗透测试平台兼安全审计平台,它集成了多款漏洞检测.目标识别和漏洞利用工具. Kali Linux是专门用于渗透测试的Linux操作系统:基于De ...
- 从实际案例聊聊Java应用的GC优化--转
https://tech.meituan.com/jvm_optimize.html 当Java程序性能达不到既定目标,且其他优化手段都已经穷尽时,通常需要调整垃圾回收器来进一步提高性能,称为GC优化 ...
- 16 继续讲C#中的条件执行。if...else if...else
if...else...语句可以让我们判断两种情况.当条件为真的时候,执行一部分:当条件为假的时候,执行另一部分.如果我们需要判断3种,4种,5种情况,那我们应该怎么办呢? 在C#中我们可以 使用if ...
- ValueError: multi-byte encodings are not supported
pyton解析xml时,报错 是因为编码的问题,把xml的头 <?xml version="1.0" encoding="gb2312"?> 改成 ...
- CSS3 opacity
opacity用来设置元素的透明度. 值被约束在[0.-1.0]范围内,如果超过了这个范围,其计算结果将截取到与之最相近的值. 0表示完全透明,1表示完全不透明. 浏览器支持: (1).IE浏览器支持 ...