http://poj.org/problem?id=3128
大雑把な質問の意味:26の大文字の文字列を含む文字列を入力し、交換が正方形の交換であるかどうかを判断するために代替として見ることができます
最初にあることは、正方形見えるものの代替と考えることができます。それもレン長である場合、特定の正方形を二つの等しい長さ、レン/ 2の値に分割された後、1サイクル正方形まだ後に長さが奇数の場合、サイクルの交換のために、その値は、偶数奇数サイクルすることができ、同じ長さ。サイクルの長さが偶数である場合したがって、現在の交換を考慮し、それは元の正方形に置き換えなければならない来るので、サイクル長にペアにペアリングされなければなりません。正方形の周期の偶数を得るために元の長さに置き換えてもよい長さのサイクルの奇数のために、それは、長さの周期の奇数来る乗であってもよいです。したがって、変位電流が正方形の順列と同等であるか否かが判断される偶数の長さに対する変位のサイクルの現在の数が偶数であるかを判断します。
オリジナルリンクします。https://blog.csdn.net/u013081425/article/details/31417679
する#include <stdio.hに> する#include <iostreamの> する#include <アルゴリズム> の#include <セット> の#include <マップ> の#include <ベクトル> の#include <math.h>の 書式#include <string.hの> する#include <キュー> の#include <ストリング> の#include <STDLIB.H> の#define LL長い長 の#define _LL __int64 の#define EPS 1E-8 の#define PIのACOS(-1.0) 名前空間stdを使用。 const int型MAXN = 1010; const int型INF = 0x3f3f3f3f。 INT [30]。 チャーS [30]。 int型VIS [30]。 INT NUM [30]。 BOOL解く() { memsetの(VIS、0、はsizeof(VIS))。 memset(NUM、0、はsizeof(NUM))。 私はint型。 のために(I = 1; I <= 26である; I ++) (VIS [A [I]]!)のIF BREAK; IF(I> 26である) BREAK; 。int型CNT = 1; 。VIS [I] = 1; //ドゥフラグを忘れるI INT T = A [I]; VIS [T] = 1; ながら(!T = I) { VIS [T] = 1; T = A [T]; CNT ++; } IF(CNT%2 == 0)//は偶数がインクリメントされるサイクル数に対応する、ある1。 NUM [CNT] ++; } フラグにINT = 1; I <= 26である; = I + 2)(INT I = 2 { IF(NUM [I !]%2 = 0) { でフラグ= 0; BREAK; } } IF(内のフラグ== 1)。 trueに戻り、 偽に戻ります; } )(INTメイン { int型のテスト。 scanf関数( "%dの"、およびテスト)。 (test--)一方 { scanf関数( "%s"は、S + 1)。 以下のために(INT I 1 =; I <= 26; I ++) [I] = S [I] - 'A' + 1。 もし(()解決) のprintf( "はい\ N"); 他のprintf( "いいえ\ N"); } 0を返します。 }