程序设计思维与实践 Week15 作业 (3/4/数据班)

程序设计思维与实践 Week15 作业 (3/4/数据班)

A - ZJM 与霍格沃兹(必做)

问题分析

将魔咒与对应功能保存到数组中,录字符串哈希值与数组下标,对于要查询的字符串,求取其哈希值并在map中查找。

#include <iostream>
#include <string.h>
#include <map>
using namespace std;
const int seed=7; 
char str1[100005][25];
char str2[100005][85];
map<unsigned long long,int> mp;
unsigned long long Hash(char*str,int l,int r)
{
	unsigned long long ans=0,temp=seed;
	for(int i=l;i<=r;i++)
	{
		if(str[i]!=' ')
		{
			ans+=str[i]*temp;
			temp*=temp;
		}
	}
	return ans;
}
int main() {
	int n=0;
	char temp[105];
	while(scanf("%[^
]",temp)&&strcmp(temp,"@END@")!=0)
	{
		getchar();
		int len=strlen(temp);
		int l=1,r=1;
		for(;r<len&&temp[r]!=']';r++);
		strncpy(str1[n],temp+1,r-l);
		unsigned long long h=Hash(temp,l,r-1);
		mp[h]=n;
		l=r+2;r=len;
		strncpy(str2[n],temp+l,r-l);
		h=Hash(temp,l,r-1);
		mp[h]=n;
		n++;
	}
	int num;
	scanf("%d",&num);getchar();
	for(int i=0;i<num;i++)
	{
		scanf("%[^
]",temp);getchar();
		int len=strlen(temp);
		unsigned long long h;
		if(temp[0]=='[')
			h=Hash(temp,1,len-2);
		else
			h=Hash(temp,0,len-1);
		if(mp.find(h)==mp.end())
			printf("what?
");
		else
		{
			if(temp[0]=='[')
				printf("%s
",str2[mp[h]]);
			else
				printf("%s
",str1[mp[h]]);
		}
	}
	return 0;
}

原文地址:https://www.cnblogs.com/master-cn/p/13052606.html