| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
自己给自己回复In Reply To:还没过……WA了三次MLE两次TLE四次……留个代码在这,以后有心情再修改……应该说有能力再修改……哪位好心路过帮我看看T_T Posted by:15914304086 at 2012-03-18 17:06:27 本题目:
1.题目的意思是所给出的星座出现了多少种,而不是出现了多少个(很重要)
2.存储天空全部星星,如果定义char数组,应该大小是sky[1001][1001]预留一位给'\0',
读入时可以把一行看成一个字符串scanf("%s",sky+i);
3.我是把全部星星转换成一个__int64的数组s(二维,大小1000*1000,一行的和转为一个__int64的数字),
然后每读入一个星座,又转换为一个__int64的数组ss(一维,大小50)(纯属个人做法)
然后看看s里面是否有s(暴力寻找)。
4.转换为__int64就是把"*0"看成一个二进制数,
这里可以采用<<运算符,1<<0=2^0=1,1<<2=2^2=4,3<<4=3*2^4=48(我做这题才知道,唉)
5.采用<<,要用1LL<<n,因为1是整型,如果n太大就会溢出,所以首先把1转换为long long类型。
6.数组下标有点注意:程序寻找s[i][j+3]要比s[j+3][i]要快,百度上看到的,说是跟cache有关
7.把一行转换为__int64,就像计算某一行2到7位的和,可以用之前的1-6位的和除以2(二进制下的效果就相当于去掉第一位然后除以2),加上第七位。
今天终于AC了……
#include <iostream>
using namespace std;
int main()
{
int n,m,t,p,q,x,y,i,j,u,ci=0,all;
char sky[1001][1001],star[51][51];
long long si,s[1000][1000],ss[50],*k;
while(1)
{
cin>>n>>m>>t>>p>>q;
if (n)
{
for (i=0;i<n;i++)
scanf("%s",sky+i);
x=n-p;
y=m-q;
all=0;
if (x<0 || y<0)
while (t--)
for (i=0;i<p;i++)
scanf("%s",star+i);
else
{
u=q-1;
for (i=0;i<n;i++)
{
si=0;
for (j=0;j<q;j++)
if (sky[i][j]=='*')
si+=1LL<<j;
s[0][i]=si;
for (j=1;j<=y;j++)
{
si/=2;
if (sky[i][j+u]=='*')
si+=1LL<<u;
s[j][i]=si;
}
}
while(t--)
{
for (i=0;i<p;i++)
{
scanf("%s",star+i);
si=0;
for (j=0;j<q;j++)
if (star[i][j]=='*')
si+=1LL<<j;
ss[i]=si;
}
for (j=0;j<=y;j++)
{
for (i=0;i<=x;i++)
{
for (n=0,k=s[j]+i;n<p;n++,k++)
if (*k!=ss[n])
break;
if (n==p)//found
break;
}
if (i<=x)//found
break;
}
if (j<=y)
all++;
}
}
printf("Case %d: %d\n",++ci,all);
}
else
break;
}
return 0;
//9949763 ????? 3690 Accepted 9060K 1704MS C++ 1249B 2012-03-20 11:12:27 (慢了点,代码长度还不错,挤进前20了)
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator