Zhangikun @ 2023-04-16 10:59:42
#include<bits/stdc++.h>
using namespace std;
template<class T1,class T2>struct ikundered_map
{
vector<pair<T1,T2> >hash[114514];//T1为下标的类型,T2为存储的类型
int put_id(T1 x)
{
int id;
if(typeid(T1)==typeid(1)||typeid(T1)==typeid(10000000000LL)||typeid(T1)==typeid('A')||typeid(T1)==typeid(false)||typeid(T1)==typeid(float(0.1))||typeid(T1)==typeid(0.1))
id=((int)x%114514+114514)%114514;
else
id=put_id(x[0]);
return id;
}
T2& operator[](T1 x)
{
int id;
id=put_id(x);
for(int i=0;i<hash[id].size();i++)
{
if(hash[id][i].first==x)
{
return hash[id][i].second;
}
}
T2 num;
hash[id].push_back({x,num});
return hash[id][hash[id].size()-1].second;
}
};
int main()
{
string s;
vector<string>v;
int n;
cin>>n;
ikundered_map<string,bool>kun;
for(int i=1;i<=n;i++)
{
cin>>s;
if(kun[s]==0)
{
v.push_back(s);
kun[s]=1;
}
}
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<" ";
}
return 0;
}
by hycqvvq @ 2023-04-16 11:18:43
@Zhangikun 我指的是不用 template
。
by Zhangikun @ 2023-04-16 11:20:28
@hycJuRuo emmmmmmm,我就是好奇用了template怎么处理,我自然会用普通的
by Miracle_InDream @ 2023-04-16 11:20:32
@hycjuRuo
牛逼
by hycqvvq @ 2023-04-16 11:24:02
由于 typeid(T1)
一定为 string
,所以每次执行 put_id()
都会进入后面的 else
分支,然后又递归传了个 put_id(char)
。
编译器在编译时,会检查每条语句(尽管不会被执行),然后它发现了 (int)x
(string x
)和 x[0]
(char x
)。
by hycqvvq @ 2023-04-16 11:24:28
然后 CE。
by hycqvvq @ 2023-04-16 11:24:57
@Zhangikun 那用普通的岂不美哉
by hycqvvq @ 2023-04-16 11:26:22
综上所述,string
不能强转 int
,char
没有下标用法,这是 CE 原因。
by Zhangikun @ 2023-04-16 11:27:58
@hycJuRuo 哦懂了懂了,orz
by 徐崇瑜 @ 2023-04-17 18:46:10
@Zhangikun 模板特化
定义一个 hash<_Tp>
类,然后对 hash<std::string>
类进行特化:
template<typename _Tp> class hash_maker {
public:
static int makeid(_Tp a) {
/* ... */
}
};
template class hash_maker<std::string> {
public:
/* 特化 */
};
by Zhangikun @ 2023-04-17 19:15:24
@徐崇瑜 谢谢,果然还是好人多