解析:
字符串最長爲75,所以我們可以枚舉列的最小循環節(暴力枚舉)
但是我們不能枚舉行的最小的循環節,因爲n太大了。
所以我們利用kmp求解行的最小循環節即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
char s[N][80];
bool st[N];
int ne[N];
int n,m;
int main()
{
cin>>n>>m;
memset(st,false,sizeof st);
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)//枚舉循環節長度
{
bool f=false;
for(int k=j;k<m;k+=j)//枚舉起點
{
for(int u=0;u<j&&u+k<m;u++)//枚舉其他長度的字符串和第一個循環解對比
{
if(s[i][u]!=s[i][u+k])
{
f=true;
break;
}
}
if(f==true) break;
}
if(f==true) st[j]=true;
}
}
int width;
for(int i=1;i<=m;i++)
{
if(!st[i])
{
width=i;
break;
}
}
for(int i=1;i<=n;i++) s[i][width]=0;
for(int i=2,j=0;i<=n;i++)
{
while(j&&strcmp(s[j+1],s[i])) j=ne[j];
if(strcmp(s[j+1],s[i])==0) j++;
ne[i]=j;
}
int height=n-ne[n];
cout<<width*height<<endl;
}