欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-01 19:59:16
...

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

题目

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

思路

这题卡空间。要实现两个字符串的相互转化,若直接建立字符串到字符串的映射,会超过限制空间。如果将字符串存入数组里,用哈希算法将字符串转化为一个独一无二的数字,建立数字和字符串数组下标的映射并存入map,则比字符串-字符串映射少用一半左右的空间。

查询时先用哈希算法函数将字符转化为数字,再通过map得到字符串数组的下标,就得到了目标字符串。

●以上算法完成时,还是mle了。。。我把哈希函数的返回值类型改成int才险过。

代码

#include <iostream>
#include <map>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const int seed=7;
const int themod=1e9;
int Hash(string s) {
	int temp=0;
	for (int i=0;i<s.size(); i++) {
		temp=(temp+(long long)(s[i])*seed)%themod;
		temp=temp*seed%themod; 
	}
	return temp;	
}

int n,cnt1=0,cnt2=0;
map<int,int> map1;
string v[200010];
string s,temp,str1,str2;
int main() {
	while(true)
	{
		getline(cin,s);
		if(s=="@aaa@qq.com") break;
		str1=s.substr(0,s.find("] ")+1);
		str2=s.substr(s.find("] ")+2,s.size()-s.find("] ")-1);
		v[cnt1++]=str1;
		v[cnt1++]=str2;
		map1.insert({Hash(str1),cnt2++});
		map1.insert({Hash(str2),cnt2++});
	}
	cin>>n;
	getchar();
	for(int i=1;i<=n;i++) {
		getline(cin,s);
		if(map1.find(Hash(s))==map1.end()) cout<<"what?"<<endl;
		else {
			if(s[0]=='[') {
				temp=v[map1[Hash(s)]+1];
				cout<<temp<<endl;
			}
			else {
				temp=v[map1[Hash(s)]-1];
				cout<<temp.substr(1,temp.size()-2)<<endl;
			}
		}
	}
	return 0;
}
相关标签: 算法 哈希