zoukankan      html  css  js  c++  java
  • POJ2185 Milking Grid KMP两次(二维KMP)较难

     
    大概算是我学KMP简单题以来最废脑子的KMP题目了 , 当然细节并不是那么多 , 还是码起来很舒服的 , 题目中描写的平铺是那种瓷砖一样上下对齐的平铺 , 刚开始以为像地砖一样可以交错着铺 . . . 
    需要两次kmp..我用的是题解的方法写第一次kmp...这样找起来似乎更清晰.
    下面是代码
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 using namespace std;
     8 const int maxn=10010;
     9 const double eps=1e-8;
    10 const long long modn=1000;
    11 char a[maxn][100]={};
    12 char s[100]={};
    13 int nex[maxn]={};
    14 int f[100]={};
    15 int n,m;
    16 int main(){
    17     scanf("%d%d",&n,&m);
    18     int x,y;
    19     for(int i=0;i<n;i++){
    20         scanf("%s",&a[i]);
    21         strcpy(s,a[i]);
    22         for(int j=m-1;j>0;j--){
    23             s[j]=0;
    24             for(x=0,y=0;a[i][y];x++,y++){//x for s,y for a
    25                 
    26                 if(s[x]==0){
    27                     x=0;
    28                 }
    29                 if(s[x]!=a[i][y]){
    30                     break;
    31                 }
    32             }
    33             if(!a[i][y]){
    34                 f[j]++;
    35             }
    36         }
    37     }
    38     int i,j;
    39     for(i=0;i<m;i++){
    40         if(f[i]==n){
    41             break;
    42         }
    43     }int cnt=i;
    44     j=-1,nex[0]=-1,i=0;
    45     while(i<n){
    46         if(j==-1||strcmp(a[i],a[j])==0){
    47             nex[++i]=++j;
    48         }else{
    49             j=nex[j];
    50         }
    51     }
    52     printf("%d",(n-nex[n])*cnt);
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    5、打开界面
    C++模版完全解析
    运维二三事儿
    tcpdump命令使用方法
    putty源码阅读----plink
    nginx--提供一键安装脚本
    vt100控制符
    zabbix---简介
    Dictionary
    装箱、拆箱
  • 原文地址:https://www.cnblogs.com/137shoebills/p/7786485.html
Copyright © 2011-2022 走看看