集训笔记1-set,map,hash,字符hash

来源:互联网 发布:儿童手表软件 编辑:程序博客网 时间:2024/06/02 12:33

这是萌教主版的,不是很全:

set:
因为元素不重复;count(i)统计i个数 return 1/0;
相当于vis{maxn};
s.clear()  清空;
s.erase(i)  del i;

复杂度为log(n);二叉平衡树实现;
性质:元素为有序(顺序);
遍历方法:
for(set<int>::iterator iter=s.begin();iter!=s.end();iter++)
   printf("%d\n",*iter);
s.end() 为最后一个元素的下一个;
iter只能为++;不能为=+1,=+2;

求set的最大元素:
set<int>::iterator iter=s.end();
iter--;
printf("%d\n",*iter);

multiset s1 允许有重复元素;
s1.erase(i)  del all i;

若只删一个元素;
multiset<int>::iterator iter=s.find(i);
s.erase(iter);


如果没有相应元素;find返回s.end();


lower_bond(i);第一个比i大的


****************************
map:
map<s1 ,s2>   s1为[ ],s2为返回类型;
dic[1]; 赋值为s2的默认;

时间复杂度为log(n);


*********************************


hash :
冲突:两个元素有相同的散列值;

解决冲突:
1:重选一个好的hash函数;增加不确定性和利用多个位;可以取x%1000007;
2: hash table;

hash insert 复杂度为o(1);
hash find平均复杂度为o(1);


******************************************

字符hash:
用27进制来表示ab...z;a为1;a,aa;
用unsigned可以自动取2^64模,就是爆unsigned long long;
可以不管冲突,重复的概率可以忽略;

为x进制;
h[i]=s[n-1]x^(n-1-i)+...+s[i];

Hash(i,l)=h(i)-h(i+l)x^(l);//i往后的l位;


解决问题:
1:判断子串(两串);
2:判断子串(一个长串与多个子串);{小串长度,小串数量}
3:最长公共子串;
4:最长回文;
while(low<=high){
  int mid=(low+high)/2;
  if(ok(mid)){
     low=mid+1;
  }
  else
     high =mid-1;
}


0 0
原创粉丝点击