最小表示法

2022-04-08 14:55:15 字數 1886 閱讀 4362

有n片雪花,每片雪花由六個角組成,每個角都有長度。

第i片雪花六個角的長度從某個角開始順時針依次記為ai,1,ai,2,…,ai,6。

因為雪花的形狀是封閉的環形,所以從任何乙個角開始順時針或逆時針往後記錄長度,得到的六元組都代表形狀相同的雪花。

例如ai,1,ai,2,…,ai,6和ai,2,ai,3,…,ai,6,ai,1就是形狀相同的雪花。

ai,1,ai,2,…,ai,6和ai,6,ai,5,…,ai,1也是形狀相同的雪花。

我們稱兩片雪花形狀相同,當且僅當它們各自從某一角開始順時針或逆時針記錄長度,能得到兩個相同的六元組。

求這n片雪花中是否存在兩片形狀相同的雪花。

輸入格式

第一行輸入乙個整數n,代表雪花的數量。

接下來n行,每行描述一片雪花。

每行包含6個整數,分別代表雪花的六個角的長度(這六個數即為從雪花的隨機乙個角順時針或逆時針記錄長度得到)。

同行數值之間,用空格隔開。

輸出格式

如果不存在兩片形狀相同的雪花,則輸出:

no two snowflakes are alike.

如果存在兩片形狀相同的雪花,則輸出:

twin snowflakes found.

資料範圍

1≤n≤100000,

0≤ai,j<10000000

輸入樣例:

21 2 3 4 5 6

4 3 2 1 6 5

輸出樣例:

twin snowflakes found.

最小表示法

#include

#pragma gcc optimize(3 , "ofast" , "inline")

using

namespace std ;

const

int n =

1e5+10;

int id[n]

, snows[n][10

], n ;

bool

cmp_carry

(int a,

int b)

bool

cmp(

int a ,

int b)

intgetmin

(int

*a)if

(b[i + k]

< b[j + k])}

k =min(i , j)

;for

(int i =

0; i <

6;i ++

) a[i]

= b[i + k]

;return0;

}int

read()

while

(isdigit

(ch)

) x = x *

10+ ch -

48, ch =

getchar()

;return x * f ;

}int

main()

sort

(id , id + n , cmp)

;int flag =0;

for(

int i =

1; i < n ; i ++)if

(!cmp(id[i]

, id[i -1]

)&&!cmp

(id[i -1]

, id[i]))

if(flag)

puts

("twin snowflakes found.");

else

puts

("no two snowflakes are alike.");

return0;

}/**/

最小表示法

最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...

最小表示法

最小表示法 思想 在字串迴圈同構問題中的應用 摘自周源的ppt 前言 最小表示法 比起動態規劃 貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷 同構 一類問題中卻起著重要的作用。本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。到底什麼是迴圈同構的字串呢...

最小表示法

最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...