模板(数据结构)
来源:互联网 发布:未授权域名 编辑:程序博客网 时间:2024/06/05 13:31
数据结构:
链式前向星(存储结构)
矩阵快速幂
树状数组
RMQ问题
线段树
manacher算法
链式前向星(存储结构)
http://blog.csdn.net/acdreamers/article/details/16902023 // 具体解析;
[cpp] view plain copy
- // 按边存储
- struct Edge
- {
- int next;
- int to;
- int w;
- };
- void add(int u,int v,int w)
- {
- edge[cnt].w = w;
- edge[cnt].to = v;
- edge[cnt].next = head[u];
- head[u] = cnt++;
- }
矩阵快速幂:
[cpp] view plain copy
- struct mat{
- long long arr[2][2];
- mat(){ memset(arr, 0, sizeof(arr)); }
- mat mul(mat &b){
- mat res;
- for(int i = 0; i < 2; ++i){
- for(int k = 0; k < 2; ++k){
- if(this->arr[i][k]){ //优化:0特别多时,复杂度可能会降低到O(n^2)
- for(int j = 0; j < 2; ++j){
- res.arr[i][j] += this->arr[i][k]*b.arr[k][j];
- if(res.arr[i][j] >= MOD) res.arr[i][j]%=MOD;
- }
- }
- }
- }
- return res;
- }
- };
树状数组:
[cpp] view plain copy
- // 注意树状数组下标从1开始;
- inline int lowbit(int x){
- return x&-x;
- }
- int sum(int x){
- int ret = 0;
- while(x > 0) { ret += C[x]; x -= lowbit(x); }
- return ret;
- }
- void add(int x, int d){ // 点修改;
- while(x <= n){
- C[x] += d; x += lowbit(x);
- }
- }
RMQ问题:
[cpp] view plain copy
- void RMQ_init(const vector<int> &A){ // d[i][j] 表示从i开始,长度为2^j的一段元素中的最小值;
- int n = A.size();
- for(int i = 0; i < n; ++i) d[i][0] = A[i];
- for(int j = 1; (1<<j) <= n; ++j){
- for(int i = 0; i+(1<<j)-1 < n; ++i)
- d[i][j] = min(d[i][j-1], d[i+(1<<(j-1))][j-1]);
- }
- }
- int RMQ(int L, int R){
- int k = 0;
- while((1<<(k+1)) <= R-L+1) k++; // 如果2^(k+1) <= R-L+1, 那么k还可以加1;
- return min(d[L][k], d[R-(1<<k)+1][k]);
- }
线段树区间更新,区间覆盖;
[cpp] view plain copy
- int _sum, _min, _max, y1, y2; //y1, y2表示查询的区间;
- struct IntervalTree {
- int sumv[maxnode], minv[maxnode], maxv[maxnode], setv[maxnode], addv[maxnode];
- // 维护信息
- void maintain(int o, int L, int R) {
- int lc = o*2, rc = o*2+1; // 这里注意的是,如果是点跟新需要加一句 sumv[o] = minv[o] = maxv[o] = 0;
- if(R > L) {
- sumv[o] = sumv[lc] + sumv[rc];
- minv[o] = min(minv[lc], minv[rc]);
- maxv[o] = max(maxv[lc], maxv[rc]);
- }
- if(setv[o] >= 0) { minv[o] = maxv[o] = setv[o]; sumv[o] = setv[o] * (R-L+1); }
- if(addv[o]) { minv[o] += addv[o]; maxv[o] += addv[o]; sumv[o] += addv[o] * (R-L+1); }
- }
- // 标记传递
- void pushdown(int o) {
- int lc = o*2, rc = o*2+1;
- if(setv[o] >= 0) {
- setv[lc] = setv[rc] = setv[o];
- addv[lc] = addv[rc] = 0;
- setv[o] = -1; // 清除本结点标记
- }
- if(addv[o]) {
- addv[lc] += addv[o];
- addv[rc] += addv[o];
- addv[o] = 0; // 清除本结点标记
- }
- }
- void update(int o, int L, int R) {
- int lc = o*2, rc = o*2+1;
- if(y1 <= L && y2 >= R) { // 标记修改
- if(op == 1) addv[o] += v; //根据题目要求修改;
- else { setv[o] = v; addv[o] = 0; }
- } else {
- pushdown(o);
- int M = L + (R-L)/2;
- if(y1 <= M) update(lc, L, M); else maintain(lc, L, M);
- if(y2 > M) update(rc, M+1, R); else maintain(rc, M+1, R);
- }
- maintain(o, L, R);
- }
- void query(int o, int L, int R, int add) {
- if(setv[o] >= 0) {
- int v = setv[o] + add + addv[o];
- _sum += v * (min(R,y2)-max(L,y1)+1);
- _min = min(_min, v);
- _max = max(_max, v);
- } else if(y1 <= L && y2 >= R) {
- _sum += sumv[o] + add * (R-L+1);
- _min = min(_min, minv[o] + add);
- _max = max(_max, maxv[o] + add);
- } else {
- int M = L + (R-L)/2;
- if(y1 <= M) query(o*2, L, M, add + addv[o]);
- if(y2 > M) query(o*2+1, M+1, R, add + addv[o]);
- }
- }
- };
kmp模板
[cpp] view plain copy
- /*
- * kmp算法
- * 时间复杂度O(n+m);
- */
- // 获得Next数组;
- void getNext(int len){
- int j, k;
- j = 0; k = -1; Next[0] = -1;
- while(j <= len){
- if(k == -1 || word[j] == word[k]){
- ++j; ++k;
- if(word[j] != word[k]) Next[j] = k;
- else Next[j] = Next[k];
- } else
- k = Next[k];
- }
- }
- //返回模式串在主串S中出现的次数
- int kmpCount(){
- int ans = 0;
- int j = 0; // j表示匹配的模式串位置;
- int slen = strlen(test);
- int tlen = strlen(word);
- for(int i = 0; i < slen; ){
- if(j == -1 || word[j] == test[i]) i++, j++;
- else j = Next[j];
- if(j == tlen){
- ans++;
- j = Next[j];
- }
- }
- return ans;
- }
[cpp] view plain copy
- /*
- * manacher 算法
- * O(n)时间求字符串的最长回文子串
- * 需要先将字符串处理; 如"12212321" 改为"$#1#2#2#1#2#3#2#1#"
- * P[i]-1正好是原字符串中回文串的总长度;
- */
- int id(0), mx(0); // id表示回文子串的中心, mx表示回文串的边界;
- for(int i = 1; i < len; ++i) {
- p[i] = mx > i ? min(mx-i, p[2*id-i]) : 1;
- while(s[i+p[i]] == s[i-p[i]]) p[i]++;
- if(i+p[i] > mx) {
- mx = i+p[i];
- id = i;
- }
- }
大整数类模板:
[cpp] view plain copy
- //基于vector<int>;
- //字符串不自动处理前导0;
- struct BigInteger{
- static const int BASE = 100000000;
- static const int WIDTH = 8;
- vector<int> s;
- BigInteger(long long num = 0) { *this = num; }
- BigInteger& operator = (long long);
- BigInteger& operator = (string&);
- BigInteger operator + (BigInteger &b); //正数相加;
- BigInteger operator - (BigInteger &b); //正数相减, 结果为正数;
- BigInteger operator * (BigInteger &b);
- BigInteger operator / (int b); // 大整数间的除法能力有限,还写不出来;
- int operator % (int b);
- bool operator < (const BigInteger &b) const; //使用sort, map, set时需要定义;
- bool operator > (const BigInteger &b) const;
- bool operator <= (const BigInteger &b) const;
- bool operator >= (const BigInteger &b) const;
- bool operator != (const BigInteger &b) const;
- bool operator == (const BigInteger &b) const;
- };
- BigInteger& BigInteger::operator = (long long num){
- s.clear();
- do{
- s.push_back(num % BASE);
- num /= BASE;
- }while(num > 0);
- return *this;
- }
- BigInteger& BigInteger::operator = (string &str){
- s.clear();
- int x, len = (str.length()-1)/WIDTH + 1;
- for(int i = 0; i < len; ++i){
- int _end = str.length()-WIDTH*i;
- int start = max(0, _end-WIDTH);
- sscanf(str.substr(start, _end-start).c_str(), "%d", &x);
- s.push_back(x);
- }
- return *this;
- }
- BigInteger BigInteger::operator + (BigInteger &b){
- BigInteger c;
- c.s.clear();
- for(unsigned i = 0, g = 0; ; ++i){
- if(g == 0 && i >= s.size() && i >= b.s.size()) break;
- int x = g;
- if(i < s.size()) x += s[i];
- if(i < b.s.size()) x += b.s[i];
- c.s.push_back(x % BASE);
- g = x / BASE;
- }
- return c;
- }
- BigInteger BigInteger::operator - (BigInteger &b){
- BigInteger c;
- c.s.clear();
- for(unsigned i = 0, g = 0; ; ++i){ //bug;
- if(g == 0 && i >= s.size() && i >= b.s.size()) break;
- int x = g + s[i];
- if(i < b.s.size()) x -= b.s[i];
- if(x < 0) { c.s.push_back(BASE + x); g = -1; }
- else {c.s.push_back(x); g = 0; }
- }
- if(c.s.back() == 0) c.s.erase(c.s.end()-1);
- return c;
- }
- BigInteger BigInteger::operator * (BigInteger &b){
- BigInteger c;
- c.s.clear();
- c.s.resize(s.size()+b.s.size()-1);
- long long g = 0;
- unsigned j;
- for(unsigned i = 0; i < s.size(); ++i){
- for(j = 0; j < b.s.size() ; ++j){
- long long x = g + static_cast<long long>(s[i])*b.s[j]+c.s[i+j];
- c.s[i+j] = x % BASE;
- g = x / BASE;
- }
- if(g != 0){
- if(i+j+1 > c.s.size()) c.s.resize(i+j+1);
- c.s[i+j] += g;
- g = 0;
- }
- }
- return c;
- }
- BigInteger BigInteger::operator / (int b){
- BigInteger c;
- c.s.clear();
- c.s.resize(s.size());
- long long g = 0;
- for(int i = s.size()-1; i >= 0; --i){
- c.s[i] = (g*BASE + s[i])/b;
- g = g*BASE + s[i] - c.s[i]*b;
- }
- int clear_0 = s.size()-1; //清除前导0;
- while(c.s[clear_0] == 0 && clear_0 > 0){
- c.s.erase(c.s.begin()+clear_0--);
- }
- return c;
- }
- int BigInteger::operator % (int b){
- int remainder = 0; //求余数;
- for(int i = s.size()-1; i >= 0; --i){
- remainder = ((remainder*BASE)%b + s[i]) % b;
- }
- return remainder;
- }
- bool BigInteger::operator < (const BigInteger &b) const {
- if(s.size() != b.s.size()) return s.size() < b.s.size();
- for(int i = s.size()-1; i >= 0; --i)
- if(s[i] != b.s[i]) return s[i] < b.s[i];
- return false; //相等;
- }
- bool BigInteger::operator > (const BigInteger &b) const { return b < *this; }
- bool BigInteger::operator <= (const BigInteger &b) const { return !(*this > b); }
- bool BigInteger::operator >= (const BigInteger &b) const { return !(*this < b); }
- bool BigInteger::operator != (const BigInteger &b) const { return (*this < b) || (*this > b); }
- bool BigInteger::operator == (const BigInteger &b) const { return !(b < *this) && !(*this > b); }
- ostream& operator << (ostream &out, const BigInteger &b){
- out << b.s.back();
- for(int i = b.s.size()-2; i >= 0; --i){
- char buf[10];
- sprintf(buf, "%08d", b.s[i]);
- out << buf;
- }
- return out;
- }
- istream& operator >> (istream &in, BigInteger &b){
- string str;
- in >> str;
- b = str;
- return in;
- }
0 0
- 数据结构模板
- 数据结构模板
- 模板-数据结构
- [模板] 数据结构
- 模板(数据结构)
- 数据结构模板
- 数据结构模板
- 数据结构模板
- 数据结构模板
- 【LaTeX】CTeX数据结构模板
- 数据结构 字典树模板
- 数据结构--AC自动机--模板
- 模板:(数据结构:线段树)
- 数据结构---邻接表(模板)
- 数据结构---各种树模板
- c++数据结构模板
- 数据结构中链表模板
- 数据结构—KMP模板
- 设置response对象当中的头部信息简单应用和个人理解
- 寄存器介绍
- 51Nod
- RxJava之SubscribeOn
- js动态添加类,移除类。toggclass
- 模板(数据结构)
- 在python(x,y)安装Opencv
- poj2796-动态规划思想+回溯&&单调栈第一题
- 我的C#学习历程
- springmvc注解式控制器的数据验证、类型转换及格式化
- Unity背包系统
- 使用Spring Session redis进行Session共享
- apache 和 一个 tomcat 集成 测试成功 案例 代码
- 使用Http协议异常:java.net.MalformedURLException: no protocol: www.baidu.com