資料結構 最小表示法

2021-10-11 21:32:18 字數 1699 閱讀 8855

1282 時鐘

有n個時鐘,每個時鐘有m個指標,p個刻度。時鐘是圓形的,p個刻度均分整個圓。每個時鐘每個指標指向整數刻度,並且每個時鐘自身指標指向的數字都不同。你可以任意旋轉時鐘的表盤,但是你不能轉指標。問最後有多少對時鐘可以變成相同的狀態。

例如:n = 5,m = 2,p = 4,5個時鐘的資料如下

經過旋轉後。 其中(1, 3), (1, 4), (2, 5) 和 (3, 4)是相同的。

給出所有時鐘的資料,求有多少對時鐘是相同的。

輸入第1行:3個數n, m, p中間用空格分隔,其中n為時鐘的數量,m為表針的數量,p為刻度的數量(1 <= m, n <= 500, 1 <= p <= 10^9, m <= p)。

第2 - n + 1行:每行m個數,對應乙個時鐘,m個指標的位置。

輸出輸出有多少對時鐘是相同的。

輸入樣例

5 2 4

1 22 4

4 32 3

1 3輸出樣例

4對於兩個時鐘是否相同,因為只能旋轉表盤,不能旋轉表針。。所以我們只需要看看指標之間的差值是否相同就好了。。。最小表示法,返回串s字典序最小的迴圈同構起始位置

最後map記錄一下就好了

#include

using

namespace std;

const

int maxn =

2e5+5;

int a[maxn]

;int cha[maxn]

;int ans =0;

mapint>

,int

>mp;

int n,m,p;

intgetmin

(int s,

int len)

}return i < j ? i : j;

}void

solve()

cha[m -1]

= a[0]

+ p - a[m -1]

;int d =

getmin

(cha,m)

; vector<

int>tmp;

tmp.

clear()

;for

(int i = d;i < m;i++

) tmp.

push_back

(cha[i]);

for(

int i =

0;i < d;i++

) tmp.

push_back

(cha[i]);

ans +

= mp[tmp]

;//加上之前出現過的相同順序陣列的個數

mp[tmp]++;

}int

main()

printf

("%d\n"

,ans)

;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表示...