poj 3128 Leonardo's Notebook(置换的幂)
http://poj.org/problem?id=3128
大致题意:输入一串含26个大写字母的字符串,能够把它看做一个置换。推断这个置换是否是某个置换的平方。
能够先正着考虑一个置换的平方出现什么情况。对于置换中的循环,若其长度为偶数。平方以后一定分成了两个长度相等的循环,若长度是奇数。平方以后仍是一个循环,长度不变。因此。考虑当前置换。若某个循环的长度为偶数,那么它一定是原始置换平方得来的,并且等长度的循环一定有偶数个。对于长度为奇数的循环,它可能是原始置换某个长度为偶数的循环平方得到的。也可能是长度为奇数的循环平方得来的。所以,判定当前置换是否是某个置换的平方等价于推断当前置换
长度为偶数的循环个数是否为偶数个。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)
using namespace std; const int maxn = 1010;
const int INF = 0x3f3f3f3f; int a[30];
char s[30];
int vis[30];
int num[30]; bool solve()
{
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
int i; while(1)
{
for(i = 1; i <= 26; i++)
if(!vis[a[i]])
break;
if(i > 26)
break;
int cnt = 1;
vis[i] = 1; //不要忘记标记i
int t = a[i];
vis[t] = 1;
while(t != i)
{
vis[t] = 1;
t = a[t];
cnt++;
}
if(cnt % 2 == 0) //是偶数,相应循环个数就加1
num[cnt]++;
}
int flag = 1;
for(int i = 2; i <= 26; i += 2)
{
if(num[i] % 2 != 0)
{
flag = 0;
break;
}
}
if(flag == 1)
return true;
return false;
} int main()
{
int test;
scanf("%d",&test);
while(test--)
{
scanf("%s",s+1);
for(int i = 1; i <= 26; i++)
a[i] = s[i]-'A' + 1; if(solve())
printf("Yes\n");
else printf("No\n");
}
return 0;
}
poj 3128 Leonardo's Notebook(置换的幂)的更多相关文章
- POJ 3128 Leonardo's Notebook (置换)
Leonardo's Notebook Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2324 Accepted: 98 ...
- poj 3128 Leonardo's Notebook——思路(置换)
题目:http://poj.org/problem?id=3128 从环的角度考虑. 原来有奇数个点的环,现在点数不变: 原来有偶数个点的环(设有 k 个点),现在变成两个大小为 k/2 的环. 所以 ...
- poj 3128 Leonardo's Notebook (置换群的整幂运算)
题意:给你一个置换P,问是否存在一个置换M,使M^2=P 思路:资料参考 <置换群快速幂运算研究与探讨> https://wenku.baidu.com/view/0bff6b1c6bd9 ...
- POJ 3128 Leonardo's Notebook [置换群]
传送门 题意:26个大写字母的置换$B$,是否存在置换$A$满足$A^2=B$ $A^2$,就是在循环中一下子走两步 容易发现,长度$n$为奇数的循环走两步还是$n$次回到原点 $n$为偶数的话是$\ ...
- UVA 12103 - Leonardo's Notebook(数论置换群)
UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...
- POJ1026 Cipher(置换的幂运算)
链接:http://poj.org/problem?id=1026 Cipher Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- poj 2778 AC自己主动机 + 矩阵高速幂
// poj 2778 AC自己主动机 + 矩阵高速幂 // // 题目链接: // // http://poj.org/problem?id=2778 // // 解题思路: // // 建立AC自 ...
- UVaLive 3641 Leonardo's Notebook (置换)
题意:给定一个置换 B 问是否则存在一个置换 A ,使用 A^2 = B. 析:可以自己画一画,假设 A = (a1, a2, a3)(b1, b2, b3, b4),那么 A^2 = (a1, a2 ...
- UVA12103 —— Leonardo's Notebook —— 置换分解
题目链接:https://vjudge.net/problem/UVA-12103 题意: 给出大写字母“ABCD……Z”的一个置换B,问是否存在一个置换A,使得A^2 = B. 题解: 对于置换,有 ...
随机推荐
- 基于jQuery带标题的图片3D切换焦点图
今天给大家分享一款基于jQuery带标题的图片3D切换焦点图.这款焦点图适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 实现的代码. htm ...
- 使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写
最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...
- jQuery入门第三
jQuery入门第三 1.HTML 2.CSS 衣服 3.javascript 可以动的人 4.DOM 编程 对html文档的节点操作 5.jQuery 对 javascript的封装 简练的语法 复 ...
- (Problem 19)Counting Sundays
You are given the following information, but you may prefer to do some research for yourself. 1 Jan ...
- CVTE 一面
在网上做完了测评之后,当天就收到面试的通知了,CVTE效率真高.第二天就去参加面试,面试前紧张了一把,后来去到之后发现只有几个应聘者,很多面试官前面都没人,估计现在中午一点,所以都去吃饭了.我和一个同 ...
- Speex manul中文版
Speex manul中文版 在VOIP的音频算法中,回音处理已经成为一个关系通话质量的主要问题. 回声的产生在IP网络主要有两种:1.声学回声2.电路回声 声学回声主要又分成以下几种:a ) 直 ...
- 【iOS知识学习】_如何判断手机是否为静音模式
目前我涉及的app要获取系统是否为静音模式,到网上搜了一下,千篇一律的都是一样的,而且都是iOS5.0以前才适应的知识,这个大家去搜一下就会很容易发现,找了很久终于找到一个5.0以后适用的,那位大神的 ...
- js 去除字符串左右两端的空格
<script type="text/javascript"> function trim(str){ //删除左右两端的空格 return str.repl ...
- FusionCharts 学习总结
FusionCharts和Charts一样都是对数据进行统计并绘制成图标的控件,但FusionCharts带有跨浏览器的flash图表组件解决方案,功能更为强大.. 在这里我将采用Js来加载Fusio ...
- Shader程序中内置的状态变量
经常在着色器程序需要访问一些全局状态,像当前的 model view projection 矩阵,当前环境的颜色诸如此类. 内置的矩阵 UNITY_MATRIX_MVP:当前模型 视窗 投影矩阵 UN ...