zoukankan      html  css  js  c++  java
  • 题解 POJ2185 【Milking Grid】

    题目链接:Link

    Problem

    Solution

    显然,最终的划分方法在每一行中都必须满足。
    求最小循环节是KMP的基本应用之一,我们可以O(nm)求出每一行、每一列的最小循环节长度,分行和列求出它们的lcm,最终再乘起来即可。
    注意:如果取lcm的时候发现值已经大于等于原来的长度了,就不用考虑循环了。

    Code

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int R,C;
    char a[10005][80],buf[10005];
    inline int gcd(int a,int b) { return b?gcd(b,a%b):a; }
    inline int lcm(int a,int b) { return a/gcd(a,b)*b; }
    inline int Get(char *s,int n)
    {
    	static int nxt[10005];
    	nxt[1]=0;
    	for(int i=2,j=0;i<=n;i++)
    	{
    		while(j&&s[i]!=s[j+1]) j=nxt[j];
    		if(s[i]==s[j+1]) j++;
    		nxt[i]=j;
    	}
    	return n-nxt[n];
    }
    int main()
    {
    #ifdef local
    	freopen("pro.in","r",stdin);
    #endif
    	scanf("%d%d",&R,&C);
    	int clen=1,rlen=1;
    	for(int i=0;i<R;i++) scanf("%s",a[i]);
    	for(int i=0;i<R;i++)
    	{
    		clen=lcm(clen,Get(a[i]-1,C));
    		if(clen>=C) { clen=C; break; }
    	}
    	for(int i=0;i<C;i++)
    	{
    		for(int j=0;j<R;j++) buf[j]=a[j][i];
    		rlen=lcm(rlen,Get(buf-1,R));
    		if(rlen>=R) { rlen=R; break; }
    	}
    	printf("%d
    ",rlen*clen);
    	return 0;
    }
    
  • 相关阅读:
    二叉排序树
    堆排序
    线索化二叉树
    vue 格式化代码
    线程的理解
    声明式的服务调用 Feign
    使用锁 的理解
    zookeeper 的理解
    AQS 源码解析
    HashMap 的理解与结构
  • 原文地址:https://www.cnblogs.com/happyZYM/p/11379934.html
Copyright © 2011-2022 走看看