poj 1026 Cipher(置换群T_T)
2012-08-27 17:42
405 查看
跪了一个下午了,才发现在循环哪里写错了WA到死。
题目意思是:
给出了一个长为N的序列,和需要按这序列交换k次的字符串 (如长度不足n,就补空格) .交换方式时字符串下标为i与序列中num[i]进行交换。
做法,还是根据循环节,既然它都说按照这个关系交换的,那就有个规律进过L就换回原来位置,这个L就是循环节长度,交换k次,k个L略去K%L就是其最后的结果。
k没限制大小所以直接模拟必然会超时.
题目意思是:
10 4 5 3 7 2 8 1 6 10 9 1 Hello Bob 1995 CERC 0 0
给出了一个长为N的序列,和需要按这序列交换k次的字符串 (如长度不足n,就补空格) .交换方式时字符串下标为i与序列中num[i]进行交换。
做法,还是根据循环节,既然它都说按照这个关系交换的,那就有个规律进过L就换回原来位置,这个L就是循环节长度,交换k次,k个L略去K%L就是其最后的结果。
k没限制大小所以直接模拟必然会超时.
/* Problem ID:poj 1026 Meaning: 将i上的字符与num[i]交换k次 Analyzing:置换群组合数学 */ #include <iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> using namespace std; #define FOR(i,s,t) for(int i=(s); i<(t); i++) #define LL long long #define BUG puts("here!!!") #define STOP system("pause") #define file_r(x) freopen(x, "r", stdin) #define file_w(x) freopen(x, "w", stdout) #define maxn 205 LL gcd(LL a,LL b) {return a?gcd(b%a,a):b;} int main(){ int n,num[maxn],k,L[maxn]; char str[maxn],str1[maxn]; while(scanf("%d",&n)&&n){ FOR(i,0,n) {scanf("%d",&num[i]);num[i]-=1;} memset(L,0,sizeof(L)); FOR(i,0,n){ int j=num[i]; while(1){ L[i]++; j=num[j]; if(j==num[i]) break; } } while(scanf("%d",&k)&&k){ getchar(); gets(str); int len=strlen(str); FOR(i,len,n) str[i]=' '; str ='\0'; memset(str1,0,sizeof(str1)); strcpy(str1,str); FOR(i,0,n){ int l=i,r=i; FOR(j,0,k%L[i]) r=num[r]; str1[r]=str[l]; } puts(str1); } puts(""); } return 0; }
相关文章推荐
- POJ 1026 Cipher(置换群)
- 【置换群】 HDOJ 1439 && POJ 1026 Cipher
- poj 1026 Cipher【置换群*循环节】
- POJ 1026 Cipher (置换群)
- poj 1026 Cipher(置换群)
- poj 1026 Cipher(置换群循环节)
- POJ 1026 Cipher(置换群)
- poj 1026 Cipher (置换群)
- poj1026--Cipher(置换群)
- POJ 1026 - Cipher【置换群】
- poj-1026-Cipher-置换群
- POJ1026 HDU1439 Cipher【置换群】
- POJ 1026 Cipher (置换群)
- POJ 1026 Cipher(置换群)
- POJ 1026-Cipher(置换群)
- POJ 1026-Cipher(置换群-K次置换 取模循环节长度)
- poj 1026 Cipher (置换群)
- POJ 1026 Cipher 置换群
- 【POJ 1026】Cipher(置换群)
- 【POJ】1026 - Cipher(置换群)