zoukankan      html  css  js  c++  java
  • BZOJ1170 : [Balkan2007]Cipher

    首先对于每个位置,求出它开始长度为y的横行的hash值,然后对于hash值再求一次竖列的hash值,排序后求出众数即可。

    时间复杂度$O(n^2log n)$。

    #include<cstdio>
    #include<algorithm>
    #define N 1010
    typedef unsigned long long ll;
    const ll D1=197,D2=131;
    int n,m,x,y,i,j,ans,t,cnt;char a[N][N];ll pow1[N],pow2[N],h[N][N],tmp;
    struct P{int x,y;ll z;P(){}P(int _x,int _y,ll _z){x=_x,y=_y,z=_z;}}q[N*N],fin[N];
    inline bool cmp(const P&a,const P&b){return a.z<b.z;}
    inline bool cmp2(const P&a,const P&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
    int main(){
      scanf("%d%d",&n,&m);gets(a[0]);
      for(i=1;i<=n;i++)gets(a[i]+1);
      scanf("%d%d",&x,&y);
      for(pow1[0]=pow2[0]=i=1;i<=n||i<=m;i++)pow1[i]=pow1[i-1]*D1,pow2[i]=pow2[i-1]*D2;
      for(i=1;i<=n;i++){
        for(tmp=0,j=1;j<y;j++)tmp=tmp*D1+a[i][j],h[i][j]=0;
        for(j=y;j<=m;j++)h[i][j]=tmp=tmp*D1-pow1[y]*a[i][j-y]+a[i][j];
      }
      for(t=0,i=y;i<=m;i++){
        for(tmp=0,j=1;j<x;j++)tmp=tmp*D2+h[j][i];
        for(j=x;j<=n;j++)q[++t]=P(j-x+1,i-y+1,tmp=tmp*D2-pow2[x]*h[j-x][i]+h[j][i]);
      }
      for(std::sort(q+1,q+t+1,cmp),j=1,i=2;i<=t;i++)if(q[i-1].z!=q[i].z){
        if(i-j>ans)ans=i-j,tmp=q[j].z;
        j=i;
      }
      if(t-j+1>ans)ans=t-j+1,tmp=q[t].z;
      printf("%d %d
    ",x,y);
      for(i=1;i<=t;i++)if(q[i].z==tmp)fin[++cnt]=P(q[i].x,q[i].y,0);
      std::sort(fin+1,fin+cnt+1,cmp2);
      for(i=0;i<x;puts(""),i++)for(j=0;j<y;j++)putchar(a[fin[1].x+i][fin[1].y+j]);
      for(printf("%d
    ",cnt),i=1;i<=cnt;i++)printf("%d %d
    ",fin[i].x,fin[i].y);
      return 0;
    }
    

      

  • 相关阅读:
    vue-cli router的使用
    vue element new vue const
    mac terminal update management pack
    关于MAC升级后,vim更新插件报错
    flex入门----基础知识
    常用的flex知识 ,比起float position 好用不少
    npm 安装nodesass 或者包含nodesass的脚手架工具报错问题
    anglar cli的 rxjs_1.of is not a function
    npm node sass 安装报错
    axios ajax fetch 区别
  • 原文地址:https://www.cnblogs.com/clrs97/p/4811448.html
Copyright © 2011-2022 走看看