問題描述
每天早晨約翰的奶牛都會在擠奶的時候排成陣列,即站成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...