zoukankan      html  css  js  c++  java
  • 【kmp算法】poj2185 Milking Grid

    先对每行求出所有可能的循环节长度(不需要整除)。

    然后取在所有行中都出现了的,且最小的长度为宽。

    然后将每一行看作字符,对所有行求next数组,将n-next[n](对这些行来说最小的循环节长度)作为长。

    最后输出长乘宽即可。

    #include<cstdio>
    #include<cstring>
    using namespace std;
    bool can[10010][80];
    char s[10010][80];
    int next[80],n,m,wide,NEXT[10010];
    void GetFail(char P[],int next[])//next[i]表示s[0]~s[i-1]的前缀中,最大相等的前后缀的长度是多少
    {
        next[0]=-1;
        int len=strlen(P);
        for(int i=0;i<len;i++)
          {
            int j=next[i];
            while(j>=0 && P[i]!=P[j])
              j=next[j];
            if(j!=-1 && P[i]==P[j])
              next[i+1]=j+1;
            else next[i+1]=0;
          }
    }
    int main()
    {
    //	freopen("poj2185.in","r",stdin);
    	scanf("%d%d",&n,&m);
    	for(int i=0;i<n;++i)
    	  {
    	  	scanf("%s",s[i]);
    	  	GetFail(s[i],next);
    	  	for(int j=next[m];j!=-1;j=next[j])
    	  	  can[i][m-j]=1;
    	  }
    	for(int j=1;j<=m;++j)
    	  {
    	  	bool flag=1;
    	  	for(int i=0;i<n;++i)
    	  	  if(!can[i][j])
    	  	    {
    	  	      flag=0;
    	  	      break;
    	  	    }
    	  	if(flag)
    	  	  {
    	  	  	wide=j;
    	  	  	break;
    	  	  }
    	  }
    	for(int i=0;i<n;++i)
    	  s[i][wide]='';
    	next[0]=-1;
        int len=n;
        for(int i=0;i<len;i++)
          {
            int j=next[i];
            while(j>=0 && strcmp(s[i],s[j])!=0)
              j=next[j];
            if(j!=-1 && strcmp(s[i],s[j])==0)
              next[i+1]=j+1;
            else next[i+1]=0;
          }
        printf("%d
    ",wide*(n-next[n]));
    	return 0;
    }
  • 相关阅读:
    Python该怎么学?
    Python招聘需求
    最短路合集
    最小生成树prim算法
    最小生成树kruskal算法
    React-redux原理探索
    Redux原理探索
    头条前端面试题汇总,会持续更新
    阿里前面面试题(最全),持续更新中
    ASP.Net MVC3/4中Model验证错误信息的本地化
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6415851.html
Copyright © 2011-2022 走看看