BZOJ1170: [Balkan2007]Cipher|hash

什么傻逼题..没人做果然都是明智的选择……
让我们来看一下po姐既视感……

一开始写的自然溢出 结果OLE 以为是自然溢出被卡掉了于是写了双取模…… 结果还是OLE
最后发现尼玛这题读入坑爹……字符串里有空格不说,满满的不可见字符是咋回事……
记住不要用scanf读入……可以用gets,或者fread,注意要把一开始的回车过滤掉
getchar读进来全是错的 不知道怎么回事……
–by PoPoQQQ

做法很简单就是二维hash,然后排序找众数..
傻逼读入..傻逼读入..傻逼读入..毁我青春,颓我精神,耗我钱财…

#include<cstdio>  
#include<cstdlib>  
#include<cstring>  
#include<cmath>  
#include<queue>  
#include<set>  
#include<map>  
#include<vector>  
#include<algorithm>  
#include<iostream>  
#define ll unsigned long long
using namespace std;
struct W{int x,y;ll v;}a[1000010];
char s[1111][1111];
ll h[1111][1111],l[1111][1111],H,L,ans;
int n,m,x,y,c,mx,now,X,Y;
bool cmp(W a,W b)
{
    if(a.v==b.v)return a.x==b.x?a.y<b.y:a.x<b.x;
    return a.v<b.v;
}
int main()
{
    cin>>n>>m;
    gets(s[0]);
    for(int i=1;i<=n;i++)gets(s[i]+1);
    //for(int i=1;i<=n;i++)
        //scanf("%s",s[i]+1);
    cin>>x>>y;
    H=1;for(int i=1;i<=y;i++)H*=131;
    L=1;for(int i=1;i<=x;i++)L*=197;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)h[i][j]=h[i][j-1]*131+s[i][j];
        for(int j=m;j>=y;j--)h[i][j]=h[i][j]-H*h[i][j-y];
    }
    for(int i=y;i<=m;i++)
    {
        for(int j=1;j<=n;j++)l[j][i]=l[j-1][i]*197+h[j][i];
        for(int j=n;j>=x;j--)
        {
            c++;
            a[c].x=j-x+1;
            a[c].y=i-y+1;
            a[c].v=l[j][i]-l[j-x][i]*L;
            //cout << a[c].x<<" "<< a[c].y <<" "<<a[c].v<< endl;
        }
    }
    sort(a+1,a+c+1,cmp);
    for(int i=1;i<=c;i++)
        if(a[i].v!=a[i+1].v)
        {
            now++;
            if(now>mx)mx=now,ans=a[i].v,X=a[i].x,Y=a[i].y;
            now=0;
        }
        else now++;
    cout << x <<" "<< y << endl;
    for(int i=0;i<x;i++)
    {
        for(int j=0;j<y;j++)putchar(s[X+i][Y+j]);
        puts("");
    }
    cout<<mx<<endl;
    int flag=0;
    for(int i=1;i<=c;i++)
        if(a[i].v==ans)
            printf("%d %d\n",a[i].x,a[i].y);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值