P10475 [USACO03FALL] Milking Grid(数据加强版)题解
P10475 [USACO03FALL] Milking Grid(数据加强版)
题目描述
每天早上挤奶时,农夫约翰的奶牛们排成一个 R(1≤R≤10,000)R (1 \leq R \leq 10,000)R(1≤R≤10,000) 行乘 C(1≤C≤75)C (1 \leq C \leq 75)C(1≤C≤75) 列的矩形网格。众所周知,农夫约翰是一个相当擅长牛行为的专家,目前正在撰写一本关于奶牛饲养行为的书。他注意到,如果每头奶牛都标有一个表示其品种的大写字母,那么奶牛在挤奶时形成的二维图案有时似乎是由更小的重复矩形图案组成的。
帮助农夫约翰找到可以重复铺设以组成整个挤奶网格的最小面积的矩形单元。请注意,小矩形单元的尺寸不一定需要完全整除整个挤奶网格的尺寸,如下面的示例输入所示。
输入格式
- 第一行:两个用空格分隔的整数:RRR 和 CCC。
- 第 2…R+12\dots R+12…R+1 行:奶牛形成的网格,每个奶牛的品种用大写字母表示。每个 RRR 输入行有 CCC 个字符,没有空格或其他间隔字符。
输出格式
第一行:形成网格的最小单位的面积。
输入输出样例 #1
输入 #1
2 5
ABABA
ABABA
输出 #1
2
说明/提示
整个挤奶网格可以由图案 AB 的重复构建。
翻译来自于:ChatGPT。
思路
KMP
代码见下
#include<bits/stdc++.h>
using namespace std;
long long kmp[1000006],kmp2[1000006],as,bs,op=0;
char aa[10004][76];
string a[10004],b[10004];
int main(){
cin>>as>>bs;
for(int i=1;i<=as;i++){
for(int j=1;j<=bs;j++){
cin>>aa[i][j];
}
}
for(int i=1;i<=as;i++){
for(int j=1;j<=bs;j++){
a[i]=a[i]+aa[i][j];
}
}
for(int i=1;i<=bs;i++){
for(int j=1;j<=as;j++){
b[i]=b[i]+aa[j][i];
}
}
for(int i=2,j=0;i<=bs;i++){
while(j!=0&&b[i]!=b[j+1]){
j=kmp[j];
}
if(b[j+1]==b[i]){
j++;
}
kmp[i]=j;
}
for(int i=2,j=0;i<=as;i++){
while(j!=0&&a[i]!=a[j+1]){
j=kmp2[j];
}
if(a[j+1]==a[i]){
j++;
}
kmp2[i]=j;
}
cout<<(as-kmp2[as])*(bs-kmp[bs])<<endl;
return 0;
}

浙公网安备 33010602011771号