NKOJ 2244 奶牛陣列(KMP Hash)

2021-08-07 14:19:55 字數 1588 閱讀 7305

問題描述

每天早晨約翰的奶牛都會在擠奶的時候排成陣列,即站成r(1<=r<=10000)行c(1<=c<=75)列的矩陣。我們知道,約翰是奶牛專家,他打算寫一本關於餵養奶牛的書,他發現,當奶牛按不同血統標記以後,整個大矩陣就像由很多小矩陣無縫拼接的一樣。

請幫助約翰找到面積最小的模型矩陣,使他能拼出整個大矩陣,當然,模型矩陣的尺寸不一定能整除大矩陣,也就是說你可以用若干個模型矩陣,拼出乙個包含大矩陣的更大的矩陣。

輸入格式

第一行, 兩個整數r和c

接下來是由大寫字母構成的r*c的矩陣

輸出格式

乙個整數,表示最小模型矩陣的面積。
樣例輸入

2 5

ababa

babab

樣例輸出

4
提示

樣例說明:

模型矩陣如下:

abba

拼出的大矩陣如下:

ababab

bababa

本題usaco官方資料很弱,很多錯解可以ac,下面提供兩種正確思路。

思路一:

首先明確小矩陣不能夠重疊,所以我們考慮迴圈節。

乙個簡單的想法是求出每一行和每一列的分別的最小迴圈節,然後求最小公倍數,把行和列的最小公倍數乘起來,然而這並不是最優解,因為迴圈節可能有多個,比如

aaabcaaa

abababab

這樣的資料,兩行的最小迴圈節的最小公倍數是10,算出答案20,然而顯然正解是12。

所以我們需要求出每一行所有的迴圈節,然後求出他們取不同迴圈節時最小的最小公倍數。

觀察可以發現只需要取所有行的最小公共迴圈節長度即可(因為迴圈節的倍數也是迴圈節)。列的處理同理。

思路二:

將每一行hash成乙個數字,然後求形成數列的最小迴圈節,列同理,然後將兩個最小迴圈節長度乘起來就是答案。這樣相當求出了最小迴圈矩形。

思路二**(by rgnoh):

#include#define ll long long

#define mod

0xffff

int r,c,fail[10005],rans,cans;

ll hash[10005];

char ch[10005][80];

int main()

fail[1]=j=0;

for(i=2;i<=r;i++)

rans=r-fail[r];

for(i=1;i<=c;i++)

fail[1]=j=0;

for(i=2;i<=c;i++)

cans=c-fail[c];

printf("%d",cans*rans);

}

NKOJ1066 飢餓的奶牛 DP

問題描述 john養了若干奶牛,每天晚上奶牛都要進食。由於條件比較簡陋,並不一定所有奶牛都能吃到食物。奶牛的進食方式是這樣的 john有m個食桶 1 m 2000 分別編號為1.m。這些食桶被按照編號排成一行。john將奶牛們分成若干組,每組奶牛總是呆在一起進食的,每組奶牛會提出要求 他們需要吃第s...

樹狀陣列 賞花 nkoj2387

詢問 l,r 元素種類數 帶標記的樹狀陣列 把顏色轉化為0 1標記 記錄下next和first last,然後每個fisrt對應的值置1,l移動的時候就把l對應的地方置0,next l 對應的值置1 然後求字首和 樹狀陣列 即是種類數 created by rv on 2018 4 23.inclu...

P2345 奶牛集會(樹狀陣列)

moofest,2004 open 約翰的n 頭奶牛每年都會參加 哞哞大會 哞哞大會是奶牛界的盛事。集會上的活動很 多,比如堆乾草,跨柵欄,摸牛仔的屁股等等。它們參加活動時會聚在一起,第i 頭奶牛的座標為xi,沒有兩頭奶牛的座標是相同的。奶牛們的叫聲很大,第i 頭和第j 頭奶牛交流,會發出max x...