Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

自己给自己回复

Posted by 15914304086 at 2012-03-20 11:26:02 on Problem 3690 and last updated at 2012-03-20 11:29:58
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator