ACM模板列表 https://blog.csdn.net/nameofcsdn/article/details/107235360
//枚举2个vector的两数之和
//判断2个vector是否全等
//二维数组去掉重复行
//删除二维vector中,含有重复元素的行
//二维数组每一行排序
//判断有序数组中有多少个不同的数
//收缩计数,把[1 4 1 4 4]变成[(1,2)(4,3)]
//枚举2个vector的两数之和
template<typename T>
vector<T> everySum(vector<T>&v1,vector<T>&v2)
{
vector<T>ans;
ans.resize(v1.size()*v2.size());
int k=0;
for(int i=0;i<v1.size();i++)for(int j=0;j<v2.size();j++)ans[k++]=v1[i]+v2[j];
return ans;
}
//判断2个vector是否全等
template<typename T>
bool isSame(vector<T>&v1,vector<T>&v2)
{
if(v1.size()-v2.size())return false;
for(int i=0;i<v1.size();i++)if(v1[i]!=v2[i])return false;
return true;
}
//二维数组去掉重复行
template<typename T>
vector<vector<T>> deleteSameLine(vector<vector<T>>&v)
{
vector<vector<T>>ans;
ans.reserve(v.size());
for(int i=0;i<v.size();i++)
{
for(int j=i+1;j<v.size();j++)if(isSame(v[i],v[j]))goto deleteSameLineHere;
ans.push_back(v[i]);
deleteSameLineHere:;
}
return ans;
}
//删除二维vector中,含有重复元素的行
template<typename T>
vector<vector<T>> deleteSame(vector<vector<T>>&v)
{
vector<vector<int>>ans;
ans.reserve(v.size());
for(int i=0;i<v.size();i++)
{
for(int j=0;j<v[i].size();j++)for(int k=j+1;k<v[i].size();k++)if(v[i][j]==v[i][k])goto deleteSameHere;
ans.push_back(v[i]);
deleteSameHere:;
}
return ans;
}
//二维数组每一行排序
template<typename T>
vector<vector<T>> sort2(vector<vector<T>>&v)
{
for(int i=0;i<v.size();i++)sort(v[i].begin(),v[i].end());
return v;
}
//判断有序数组中有多少个不同的数
template<typename T>//T可以是指针或迭代器,统计范围是[left,right)
int getDifNum(T left,T right)
{
if(left==right)return 0;
int ans=1;
for(T it=left+1;it!=right;it++)ans+=*it!=*(it-1);
return ans;
}
template<typename T>
int getDifNum(vector<T>v)
{
return getDifNum(v.begin(),v.end());
}
//收缩计数,把[1 4 1 4 4]变成[(1,2)(4,3)]
template<typename T>
vector<pair<T,int>> fshr(vector<T>v)
{
vector<pair<T,int>>ans;
if(v.size()==0)return ans;
sort(v.begin(),v.end());
ans.resize(getDifNum(v));
ans[0]=make_pair(v[0],1);
for(int i=1,j=0;i<v.size();i++)
{
if(v[i]==v[i-1])ans[j].second++;
else ans[++j]=make_pair(v[i],1);
}
return ans;
}