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

推荐订阅源

C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
G
GRAHAM CLULEY
T
Tenable Blog
PCI Perspectives
PCI Perspectives
Simon Willison's Weblog
Simon Willison's Weblog
N
News and Events Feed by Topic
Know Your Adversary
Know Your Adversary
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Privacy International News Feed
C
CERT Recently Published Vulnerability Notes
NISL@THU
NISL@THU
SecWiki News
SecWiki News
S
Securelist
D
Docker
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
T
Troy Hunt's Blog
The Register - Security
The Register - Security
K
Kaspersky official blog
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
Hacker News: Ask HN
Hacker News: Ask HN
S
Secure Thoughts
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
F
Fortinet All Blogs
T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
小众软件
小众软件
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 聂微东
Attack and Defense Labs
Attack and Defense Labs
B
Blog RSS Feed
Project Zero
Project Zero
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
博客园 - 【当耐特】
V
V2EX
Help Net Security
Help Net Security
P
Proofpoint News Feed
A
Arctic Wolf

博客园 - 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;
}