惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
爱范儿
爱范儿
The Register - Security
The Register - Security
小众软件
小众软件
D
DataBreaches.Net
雷峰网
雷峰网
S
Secure Thoughts
L
LINUX DO - 最新话题
M
MIT News - Artificial intelligence
Application and Cybersecurity Blog
Application and Cybersecurity Blog
罗磊的独立博客
F
Fortinet All Blogs
博客园 - 叶小钗
TaoSecurity Blog
TaoSecurity Blog
博客园 - Franky
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
N
News and Events Feed by Topic
S
Security Affairs
The Last Watchdog
The Last Watchdog
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
Latest news
Latest news
O
OpenAI News
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
Google Online Security Blog
Google Online Security Blog
S
Securelist
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Palo Alto Networks Blog
T
The Blog of Author Tim Ferriss
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
AI
AI
SecWiki News
SecWiki News
G
GRAHAM CLULEY
Cloudbric
Cloudbric
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
LINUX DO - 热门话题
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed

博客园 - woodfish

偏序集的Dilworth定理 XJOJ历经2个月终于完成啦~~ fork()调用的一个趣题 实现google那种输入框提示的功能 POJ 3691 安徽第二题 有限状态自动机+DP 哈尔滨赛区网络预选赛总结 [计算几何]点集中的点能组成多少个正方形 [计算几何]POJ 1375 点对圆的切线+线段重叠 [计算几何]POJ 1556 判断线段相交+Dijkstra [计算几何] POJ 1873 暴力+凸包 [计算几何]POJ 1266 三角形的外接圆 圆的参数方程 [计算几何]POJ 1031 计算点对多边形的偏转角度 [计算几何]POJ2079 求点集中面积最大的三角形 [计算几何]POJ3608 求2个不相交凸包的最短距离 [计算几何]凸包的旋转卡壳算法 C++禁止一个类被继承的技术 C与汇编的接口技术 计算位数的3种方法 避免使用条件分支
POJ 1026 置换群
woodfish · 2008-09-05 · via 博客园 - woodfish

http://acm.pku.edu.cn/JudgeOnline/problem?id=1026

如果按照题意,直接模拟,由于题目中没有给k的范围,有可能超时,其实数据中都是k非常大,所以这种算法行不通。

每一次操作相当于对序列进行一次置换,由置换群的知识可知,如该置换的阶为kk,则进行k次置换的结果与进行k%kk次置换的结果相同,因此可以先求出置换群的阶。

如果对于序列中的每个元素分别求出循环阶数,然后再求所有这些结束的最小公倍数得到整个置换群的阶,这个阶任然有可能很大,超时。

换一种思路,由于进行k次置换,而每个元素的置换可以看成是独立的,即元素i进行k次置换后会到达Pi位置。因此我们单独对每个元素进行置换,求出每个元素的阶ki(<=n),然后进行k%ki次置换求出最后i元素到达的位置Pi即可。这样算法的时间复杂度是O(n^2).

//置换群
#include <stdio.h>
#include 
<string.h>char buf[201],buf2[201],buf3[201];
int a[201];int getm(int i) {
    
int ret=1;
    
int now=a[i]-1;
    
while(now!=i) {
        ret
++;
        now
=a[now]-1;
    }
    
return ret;
}
int main() {
    
int n,k;
    
char space;
    
while(scanf("%d\n",&n)!=EOF&&n) {
        
for(int i=0;i<n;i++)
            scanf(
"%d",&a[i]);
        scanf(
"\n");
        
while(scanf("%d",&k)!=EOF){
            
if(k==0) {
                scanf(
"\n");
                
break;
            }
            scanf(
"%c",&space);
            gets(buf);
            
int len=strlen(buf);
            
if(buf[len-1]=='\r') buf[len--]=0;
            
for(int i=0;i<n-len;i++) buf[len+i]=' ';
            
            memset(buf2,
0,sizeof(buf2));
            
for(int i=0;i<n;i++) {
                
int m=getm(i);
                
int kk=k%m;
                
int now=i;
                
while(kk--) {
                    now
=a[now]-1;
                }
                buf2[now]
=buf[i];
            }
            printf(
"%s\n",buf2);
        }
        putchar(
'\n');
    }
    
return 0;
}