奶牛矩陣--------------------------------------思維(kmp)

在這裏插入圖片描述
在這裏插入圖片描述
解析:
字符串最長爲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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章