首先看到这题,想都没想敲了个暴力,在da....oj上A了,然后....然后在bzoj上华丽丽的T了
我还以为数据加强了
/**************************************************************
Problem: 2462
User: syh0313
Language: C++
Result: Time_Limit_Exceed
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <set>
using
namespace
std;
int
n,m,a,b,sum[1010][1010],x[110][110],q,now[1010][1010];
bool
f;
char
c,cc;
int
main()
{
scanf
(
"%d %d %d %d"
,&n,&m,&a,&b); cc=
getchar
();
for
(
int
i=1;i<=n;i++)
{
int
ss=0;
for
(
int
j=1;j<=m;j++)
{
c=
getchar
();
now[i][j]=c-
'0'
;
ss+=now[i][j];
sum[i][j]=sum[i-1][j]+ss;
}
cc=
getchar
();
}
scanf
(
"%d%c"
,&q,&cc);
while
(q--)
{
f=0;
int
no=0;
for
(
int
i=1;i<=a;i++)
{
for
(
int
j=1;j<=b;j++)
{
c=
getchar
();
x[i][j]=c-
'0'
;
no+=x[i][j];
}
cc=
getchar
();
}
for
(
int
i=1;i<=n-a+1;i++)
{
if
(f)
break
;
for
(
int
j=1;j<=m-b+1;j++)
if
(sum[i+a-1][j+b-1]-sum[i+a-1][j-1]-sum[i-1][j+b-1]+sum[i-1][j-1]==no)
{
bool
ff=1;
for
(
int
k=1;k<=a;k++)
{
if
(!ff)
break
;
for
(
int
l=1;l<=b;l++)
if
(now[i+k-1][j+l-1]!=x[k][l]) {ff=0;
break
;}
}
if
(ff) {f=1;
break
;}
}
}
printf
(
"%d\n"
,f);
}
return
0;
}
自闭了三个小时(不想写hash)后发现有点不对劲
然后我就再以上代码基础注释掉了判断是否存在的情况,只是保留读入+输出
然后一交:T了
然后我就知道,T是因为有数据没读完(数据没按题给的严格规范),程序还没跑,所以T了,而不是因为暴力T了
然后我把getchar那部分改成字符串读入
然后......然后就A了
/**************************************************************
Problem: 2462
User: syh0313
Language: C++
Result: Accepted
Time:528 ms
Memory:9304 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <set>
using
namespace
std;
int
n,m,a,b,sum[1010][1010],x[110][110],q,now[1010][1010];
bool
f;
char
c,cc,s[1010];
int
main()
{
scanf
(
"%d %d %d %d"
,&n,&m,&a,&b);
for
(
int
i=1;i<=n;i++)
{
int
ss=0;
scanf
(
"%s"
,s+1);
for
(
int
j=1;j<=m;j++)
{
now[i][j]=s[j]-
'0'
;
ss+=now[i][j];
sum[i][j]=sum[i-1][j]+ss;
}
}
scanf
(
"%d%c"
,&q,&cc);
while
(q--)
{
f=0;
int
no=0;
for
(
int
i=1;i<=a;i++)
{
scanf
(
"%s"
,s+1);
for
(
int
j=1;j<=b;j++)
{
x[i][j]=s[j]-
'0'
;
no+=x[i][j];
}
cc=
getchar
();
}
for
(
int
i=1;i<=n-a+1;i++)
{
if
(f)
break
;
for
(
int
j=1;j<=m-b+1;j++)
if
(sum[i+a-1][j+b-1]-sum[i+a-1][j-1]-sum[i-1][j+b-1]+sum[i-1][j-1]==no)
{
bool
ff=1;
for
(
int
k=1;k<=a;k++)
{
if
(!ff)
break
;
for
(
int
l=1;l<=b;l++)
if
(now[i+k-1][j+l-1]!=x[k][l]) {ff=0;
break
;}
}
if
(ff) {f=1;
break
;}
}
}
printf
(
"%d\n"
,f);
}
return
0;
}