什么傻逼题..没人做果然都是明智的选择……
让我们来看一下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;
}