http://poj.org/problem?id=3128

大致题意:输入一串含26个大写字母的字符串,能够把它看做一个置换。推断这个置换是否是某个置换的平方。



思路:具体解释可參考

url=ihxGpxX7x7ba4dROfWpQ0wlucC03fhDtKuEETsQjYUePKN41PnCBqm0lKrAeDfPXddo8i_1l3834K7iGivkTD-bsu1lAFYS6W55CKqvr13_" style="color:rgb(255,153,0); text-decoration:none">置换群高速幂运算
研究与探讨

能够先正着考虑一个置换的平方出现什么情况。对于置换中的循环,若其长度为偶数。平方以后一定分成了两个长度相等的循环,若长度是奇数。平方以后仍是一个循环,长度不变。因此。考虑当前置换。若某个循环的长度为偶数,那么它一定是原始置换平方得来的,并且等长度的循环一定有偶数个。对于长度为奇数的循环,它可能是原始置换某个长度为偶数的循环平方得到的。也可能是长度为奇数的循环平方得来的。所以,判定当前置换是否是某个置换的平方等价于推断当前置换
长度为偶数的循环个数是否为偶数个。

#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&#39;s Notebook(置换的幂)的更多相关文章

  1. POJ 3128 Leonardo's Notebook (置换)

    Leonardo's Notebook Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2324   Accepted: 98 ...

  2. poj 3128 Leonardo's Notebook——思路(置换)

    题目:http://poj.org/problem?id=3128 从环的角度考虑. 原来有奇数个点的环,现在点数不变: 原来有偶数个点的环(设有 k 个点),现在变成两个大小为 k/2 的环. 所以 ...

  3. poj 3128 Leonardo's Notebook (置换群的整幂运算)

    题意:给你一个置换P,问是否存在一个置换M,使M^2=P 思路:资料参考 <置换群快速幂运算研究与探讨> https://wenku.baidu.com/view/0bff6b1c6bd9 ...

  4. POJ 3128 Leonardo's Notebook [置换群]

    传送门 题意:26个大写字母的置换$B$,是否存在置换$A$满足$A^2=B$ $A^2$,就是在循环中一下子走两步 容易发现,长度$n$为奇数的循环走两步还是$n$次回到原点 $n$为偶数的话是$\ ...

  5. UVA 12103 - Leonardo&#39;s Notebook(数论置换群)

    UVA 12103 - Leonardo's Notebook 题目链接 题意:给定一个字母置换B.求是否存在A使得A^2=B 思路:随意一个长为 L 的置换的k次幂,会把自己分裂成gcd(L,k) ...

  6. POJ1026 Cipher(置换的幂运算)

    链接:http://poj.org/problem?id=1026 Cipher Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  7. poj 2778 AC自己主动机 + 矩阵高速幂

    // poj 2778 AC自己主动机 + 矩阵高速幂 // // 题目链接: // // http://poj.org/problem?id=2778 // // 解题思路: // // 建立AC自 ...

  8. UVaLive 3641 Leonardo's Notebook (置换)

    题意:给定一个置换 B 问是否则存在一个置换 A ,使用 A^2 = B. 析:可以自己画一画,假设 A = (a1, a2, a3)(b1, b2, b3, b4),那么 A^2 = (a1, a2 ...

  9. UVA12103 —— Leonardo's Notebook —— 置换分解

    题目链接:https://vjudge.net/problem/UVA-12103 题意: 给出大写字母“ABCD……Z”的一个置换B,问是否存在一个置换A,使得A^2 = B. 题解: 对于置换,有 ...

随机推荐

  1. ExtJS4.2学习(二)——入门基础

    1.工程的目录结构: src里放后台的文件,WebRoot里放前台的文件. index.html或者index.jsp等是整个项目的首页,在首页我们要引入ExtJS的CSS样式文件和ExtJS的核心类 ...

  2. perl正则表达式第二周笔记

    1.使用正则表达式修改文本 1.使用正则表达式修改文本 正则表达式的功能不只有查询,还可以对文本进行修改,例如替换 $var=~m/regex/i $var=~s/regex/replacement/ ...

  3. css vertical-align全解

    CSS 的属性 vertical-align 指定了内联(inline)元素或表格单元格(table-cell)元素的垂直对齐方式.  要记住:vertical-align不影响块级元素中内容的对齐. ...

  4. Android网络框架技术

    网络相关1. Asynchronous Http Client for Android Android异步Http请求项目地址:https://github.com/loopj/android-asy ...

  5. oracle dataguard 角色切换

  6. GitHub Linux下使用方法

    1. 在网站注册帐号,创建工程 test 进入工程,右下角会有一个项目仓库的地址.https://github.com/braverior/test.git 2.Linux下 安装github sud ...

  7. 第七届河南省赛10403: D.山区修路(dp)

    10403: D.山区修路 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 69  Solved: 23 [Submit][Status][Web Bo ...

  8. SGU 242 Student&#39;s Morning 网络流(水

    题目链接:contest=0&problem=242">点击打开链接 题意: 给定n个人,m个终点 以下n行表示每一个人能够去m个点. 每一个人仅仅能去一个点. 输出随意一个方 ...

  9. vim之执行shell命令

    vim中执行shell命令,有以下几种形式 (1) :!command 不退出vim, 并执行shell命令command, 将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 (2)   ...

  10. 空类的默认函数—— SAP电面(2)/FEI

    定义一个空类 class Empty { }; 默认会生成以下几个函数 2. 拷贝构造函数 Empty(const Empty& copy) { } 3. 赋值运算符 Empty& o ...