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;
}
}