POJ 题目3128Leonardo's Notebook(置换的平方)

95 篇文章 0 订阅
Leonardo's Notebook
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 1888 Accepted: 838

Description

— I just bought Leonardo's secret notebook! Rare object collector Stan Ucker was really agitated but his friend, special investigator Sarah Kepticwas unimpressed. 
— How do you know it is genuine? 
— Oh, it must be, at that price. And it is written in the da Vinci code. Sarah browsed a few of the pages. It was obvious to her that the code was a substitution cipher, where each letter of the alphabet had been substituted by another letter. 
— Leonardo would have written the plain-text and left it to his assistant to encrypt, she said. And he must have supplied the substitution alphabet to be used. If we are lucky, we can find it on the back cover! She turned up the last page and, lo and behold, there was a single line of all 26 letters of the alphabet: 
QWERTYUIOPASDFGHJKLZXCVBNM 
— This may be Leonardo's instructions meaning that each A in the plain-text was to be replaced by Q, each B withW, etcetera. Let us see... To their disappointment, they soon saw that this could not be the substitution that was used in the book. Suddenly, Stan brightened. 
— Maybe Leonardo really wrote the substitution alphabet on the last page, and by mistake his assistant coded that line as he had coded the rest of the book. So the line we have here is the result of applying some permutation TWICE to the ordinary alphabet! Sarah took out her laptop computer and coded fiercely for a few minutes. Then she turned to Stan with a sympathetic expression. 
— No, that couldn't be it. I am afraid that you have been duped again, my friend. In all probability, the book is a fake. 

Write a program that takes a permutation of the English alphabet as input and decides if it may be the result of performing some permutation twice. 

Input

The input begins with a positive number on a line of its own telling the number of test cases (at most 500). Then for each test case there is one line containing a permutation of the 26 capital letters of the English alphabet.

Output

For each test case, output one line containing Yes if the given permutation can result from applying some permutation twice on the original alphabet string ABC...XYZ, otherwise output No.

Sample Input

2
QWERTYUIOPASDFGHJKLZXCVBNM
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Sample Output

No
Yes

Source

题意:输入一个字符串,由26的大写字母随机排列组成。置换的概念如下定义:例如 QWERTYUIOPASDFGHJKLZXCVBNM  表示进过置换换后A用Q替换,B用W替换,C用E置换,····

问你ABCDEFGHIJKLMNOPQRSTUVWXYZ 这样一个初始字符串是否可以经过任意两次相同的置换得到输入的字符串。

本质上就是问你,输入的字符串所代表的置换是否是任意一个置换的平方?

题解:

1.任意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) 分, 并且每一份的长度都为 L / gcd(l,k)

2.假如 d = gcd(L,K),l = L / gcd(L,k),那么我们只需要找到d个长为l的循环,将他们交错循环连接成一个长为 d * l 的大循环, 这样一个过程就相当于开k次方。

所以在下面的代码中我们先统计每种长度的循环的个数。

然后对每个长度为 len ( 1 <= len <= 26 )度的循环都做一下判断,看能否找到 gcd ( len, 2 )个这样的循环,若找到了,那么说明这一部分可以开2次方。没找到就直接返回false.


ac代码
#include<stdio.h>
#include<string.h>
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		char s[100];
		int v[100],num[100],i,j,k;
		scanf("%s",s);
		memset(v,0,sizeof(v));
		memset(num,0,sizeof(num));
		for(i=0;i<26;i++)
		{
			j=0;
			k=i;
			while(v[s[k]-'A']==0)
			{
				v[s[k]-'A']=1;
				j++;
				k=s[k]-'A';
			}
		//	j++;
			num[j]++;
		}
		for(i=2;i<=26;i+=2)
		{
			if(num[i]%2!=0)
				break;
		}
		if(i<=26)
			printf("No\n");
		else
			printf("Yes\n");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值