ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LA3641 Leonardo's Notebook

2019-04-02 12:43:28  阅读:332  来源: 互联网

标签:LA3641 ch read Notebook rg 长度 Leonardo 循环 2k


题意

PDF

分析

给出一个26个大写字母的置换B,是否存在A^2 = B

每个置换可以看做若干个循环的乘积。我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子。

A^2就相当于将项链旋转了两个珠子间的距离,珠子0、2、4...构成一个循环,一共有gcd(n, 2)个循环,每个循环的长度为n / gcd(n, 2)

所以当一个循环的长度为奇数的时候,平方以后还是原来的长度;

当一个循环的长度为偶数的时候,平方以后就会分解为两个长度都等于原来循环长度一半的循环。

先将置换B分解循环,对于其中长度为奇数2k+1的循环,可以通过相同长度2k+1的循环平方后从A^2中得到,也可能是2(2k+1)分解出两个2k+1的循环。

但是对于长度为偶数2k的循环来说,一定是由长度为4k的循环平方后分解出来的。

所以如果存在置换A满足A^2 = B,则B中长度为偶数的循环节一定为偶数。

时间复杂度\(O(T\times SIZE)\)

代码

#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
    rg T data=0,w=1;rg char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
    while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
    return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;

co int N=27;
char B[N];
int vis[N],cnt[N],T;
int main(){
//  freopen(".in","r",stdin),freopen(".out","w",stdout);
    read(T);
    while(T--){
        scanf("%s",B);
        memset(vis,0,sizeof vis);
        memset(cnt,0,sizeof cnt);
        for(int i=0,j,n;i<26;++i)if(!vis[i]){
            j=i,n=0;
            do vis[j]=1,j=B[j]-'A',++n;
            while(j!=i);
            ++cnt[n];
        }
        int ok=1;
        for(int i=2;i<=26;i+=2)
            if(cnt[i]&1) {ok=0;break;}
        puts(ok?"Yes":"No");
    }
    return 0;
}

标签:LA3641,ch,read,Notebook,rg,长度,Leonardo,循环,2k
来源: https://www.cnblogs.com/autoint/p/10641901.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有