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