STL练习(一):UVA1592 数据库

题目
1:为每个字符串分配一个编号,提高比较效率

map<string,int> IDdate;
vector<string> Sdate;

int ID(string a)
{
	if(IDdate.count(a)) return IDdate[a];
	Sdate.push_back(a);
	return IDdate[a]=Sdate.size()-1;
}

//可以通过 IDdate[string ] 得到字符串的编号 
//也可以通过 Sdate[i] 得到每个编号所对应的字符串 

2:枚举c1、c2,然后扫描各行

for(int c1=0;c1<m;c1++)
	{
		for(int c2=c1+1;c2<m;c2++)
		{
			//每行的两列组成一个二元组(用pair表示)
			//map将每个pair映射为对应的行数
			map<pair,int> m;
			for(int i=0;i<n;i++)
			{
				pair<int, int> p;
				p=make_pair(IDdate[Date[i][c1]],IDdate[Date[i][c2]]);
				if(m.count(p))
				{
					cout<<m[p]<<" "<<i<<endl;
					cout<<c1<<" "<<c2<<endl;
				}
				m[p]=i;
			}
		}
	}

总结:对于大量字符串比较的问题,可以先对每个字符串进行编码或者初始化
如UVA156中的初始化,UVA12096中的ID函数

//UVA156 反片语

#include<iostream>
#include<string>
#include<cctype>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
map<string,int> cnt;
vector<string> words;

string repr(const string& a)
{
	string ans=s;
	for(int i=0;i<ans.length();i++)
		ans[i]=tolower(ans[i]);
	sort(ans.begin(),ans.end());
	return ans;
}

int main()
{
	int n=0;
	string s;
	while(cin>>s)
	{
		if(s[0]=='#') break;
		words.push_back(s);
		string r=repr(s);
		if(!cnt.count(r)) cnt[r]=0;
		cnt[r]++;
	}
	vector<string> ans;
	for(int i=0;i<words.size();i++)
		if(cnt[repr(words[i])]==1) ans.push_back(words[i]);
	sort(ans.begin(),ans.end());
	for(int i=0;i<ans.size();i++)
		cout<<ans[i]<<"\n";
	return 0;
}
//UVA12096 集合栈计算机

#include<iostream>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
#define ALL(x) x.begin(),x.end()
#define INS(X) inserter(x,x.begin())

using namespace std; 
typedef set<int> Set;
map<Set,int> IDdate; 
vector<Set> setdate;

int ID(Set x)
{
	if(IDdate.count(x)) return IDdate[x];
	setdate.push_back(x);
	return IDdate[x]=setdate.size()-1;
} 

int main()
{
	stack<int>s;
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		string op;cin>>op;
		if(op=="PUSH") s.push(ID(Set()));
		if(op=="DUP") s.push(s.top());
		else
		{
			Set x1=setdate[s.top()];s.pop();
			Set x2=setdate[s.top()];s.pop();
			Set x;
			if(op=="UNION") set_union (ALL(x1),ALL(x2),INS(x));
			if(op=="INTERSECT") set_intersection(ALL(x1),ALL(x2),INS(x));
			if(op=="ADD") {x=x2;x.insert(ID(x1));}
			s.push(ID(x));
		}
		cout<<setdate[s.top()].size()<<endl;
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值