题目列表:
第二题
P1808 单词分类
考点:STL的map、set使用
此题最终就是要给每种字符串一个特定标志,下次同样字符串能快速确定之前有没有出现过。因此有三种方法记录这种特征
三种方法:
①set集合去重+hash字符串id
②set集合去重字符串
③map映射
方法一:hash字符串标记字符串,利用set将字符串id去重
#include<bits/stdc++.h>
using namespace std;
/*-------2--------*/
const int MOD=1000000007;
const int P = 10000019;
set<int> ans;
long long hashFunc(string str){
long long H =1;
for(int i=0;i<str.length();i++){
H=(H*P+str[i]-'A')%MOD;
}
return H;
}
int main(){
// freopen("in.txt","r",stdin);
string a;
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a;
sort(a.begin(),a.end());
long long id =hashFunc(a);
ans.insert(id);
}
printf("%d",ans.size()) ;
}
方法二:set直接将字符串去重
参考别人的代码发现其实可以不用转换为hash字符串
直接放入集合中即可
//《算法笔记》P450
#include<bits/stdc++.h>
using namespace std;
/*-------2--------*/
const int MOD=1000000007;
const int P = 10000019;
//这里也要改一下
set<string> ans;
long long hashFunc(string str){
// H =0;则A,AA,AAA这个测试数据最后会被判定为同一个单词,实际是三个,所以改成H=1
long long H =1;
for(int i=0;i<str.length();i++){
H=(H*P+str[i]-'A')%MOD;
}
return H;
}
int main(){
// freopen("in.txt","r",stdin);
string a;
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a;
sort(a.begin(),a.end());
ans.insert(a);
}
printf("%d",ans.size()) ;
}
方法三:map
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
map<string,bool>z;//存储字符串是否出现过
string a;
int n,sum;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
sort(a.begin(),a.end());//排序
if(!z[a]){
//如果没有出现过,组数+1
sum++;
z[a]=1;
}
}
cout<<sum;
return 0;
}
第三题
P1706 全排列问题
考点:DFS,next_permutation()函数
方法一:DFS
#include<bits/stdc++.h>
using namespace std;
//ans存储排列结果
/*------3--------*/
//b[i]==1表示数字i已访问
int b[11];
int n,ans[10]