00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <stdint.h>
00026 #include "Vec.h"
00027
00028 const uintptr_t prime2[] = {
00029 1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191,
00030 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143,
00031 4194301, 8388593, 16777213, 33554393, 67108859, 134217689,
00032 268435399, 536870909
00033 };
00034
00035
00036 const uintptr_t open_hash_primes[256] = {
00037 0x02D4AF27, 0x1865DFC7, 0x47C62B43, 0x35B4889B, 0x210459A1, 0x3CC51CC7, 0x02ADD945, 0x0607C4D7,
00038 0x558E6035, 0x0554224F, 0x5A281657, 0x1C458C7F, 0x7F8BE723, 0x20B9BA99, 0x7218AA35, 0x64B10C2B,
00039 0x548E8983, 0x5951218F, 0x7AADC871, 0x695FA5B1, 0x40D40FCB, 0x20E03CC9, 0x55E9920F, 0x554CE08B,
00040 0x7E78B1D7, 0x7D965DF9, 0x36A520A1, 0x1B0C6C11, 0x33385667, 0x2B0A7B9B, 0x0F35AE23, 0x0BD608FB,
00041 0x2284ADA3, 0x6E6C0687, 0x129B3EED, 0x7E86289D, 0x1143C24B, 0x1B6C7711, 0x1D87BB41, 0x4C7E635D,
00042 0x67577999, 0x0A0113C5, 0x6CF085B5, 0x14A4D0FB, 0x4E93E3A7, 0x5C87672B, 0x67F3CA17, 0x5F944339,
00043 0x4C16DFD7, 0x5310C0E3, 0x2FAD1447, 0x4AFB3187, 0x08468B7F, 0x49E56C51, 0x6280012F, 0x097D1A85,
00044 0x34CC9403, 0x71028BD7, 0x6DEDC7E9, 0x64093291, 0x6D78BB0B, 0x7A03B465, 0x2E044A43, 0x1AE58515,
00045 0x23E495CD, 0x46102A83, 0x51B78A59, 0x051D8181, 0x5352CAC9, 0x57D1312B, 0x2726ED57, 0x2E6BC515,
00046 0x70736281, 0x5938B619, 0x0D4B6ACB, 0x44AB5E2B, 0x0029A485, 0x002CE54F, 0x075B0591, 0x3EACFDA9,
00047 0x0AC03411, 0x53B00F73, 0x2066992D, 0x76E72223, 0x55F62A8D, 0x3FF92EE1, 0x17EE0EB3, 0x5E470AF1,
00048 0x7193EB7F, 0x37A2CCD3, 0x7B44F7AF, 0x0FED8B3F, 0x4CC05805, 0x7352BF79, 0x3B61F755, 0x523CF9A3,
00049 0x1AAFD219, 0x76035415, 0x5BE84287, 0x6D598909, 0x456537E9, 0x407EA83F, 0x23F6FFD5, 0x60256F39,
00050 0x5D8EE59F, 0x35265CEB, 0x1D4AD4EF, 0x676E2E0F, 0x2D47932D, 0x776BB33B, 0x6DE1902B, 0x2C3F8741,
00051 0x5B2DE8EF, 0x686DDB3B, 0x1D7C61C7, 0x1B061633, 0x3229EA51, 0x7FCB0E63, 0x5F22F4C9, 0x517A7199,
00052 0x2A8D7973, 0x10DCD257, 0x41D59B27, 0x2C61CA67, 0x2020174F, 0x71653B01, 0x2FE464DD, 0x3E7ED6C7,
00053 0x164D2A71, 0x5D4F3141, 0x5F7BABA7, 0x50E1C011, 0x140F5D77, 0x34E80809, 0x04AAC6B3, 0x29C42BAB,
00054 0x08F9B6F7, 0x461E62FD, 0x45C2660B, 0x08BF25A7, 0x5494EA7B, 0x0225EBB7, 0x3C5A47CF, 0x2701C333,
00055 0x457ED05B, 0x48CDDE55, 0x14083099, 0x7C69BDAB, 0x7BF163C9, 0x41EE1DAB, 0x258B1307, 0x0FFAD43B,
00056 0x6601D767, 0x214DBEC7, 0x2852CCF5, 0x0009B471, 0x190AC89D, 0x5BDFB907, 0x15D4E331, 0x15D22375,
00057 0x13F388D5, 0x12ACEDA5, 0x3835EA5D, 0x2587CA35, 0x06756643, 0x487C6F55, 0x65C295EB, 0x1029F2E1,
00058 0x10CEF39D, 0x14C2E415, 0x444825BB, 0x24BE0A2F, 0x1D2B7C01, 0x64AE3235, 0x5D2896E5, 0x61BBBD87,
00059 0x4A49E86D, 0x12C277FF, 0x72C81289, 0x5CF42A3D, 0x332FF177, 0x0DAECD23, 0x6000ED1D, 0x203CDDE1,
00060 0x40C62CAD, 0x19B9A855, 0x782020C3, 0x6127D5BB, 0x719889A7, 0x40E4FCCF, 0x2A3C8FF9, 0x07411C7F,
00061 0x3113306B, 0x4D7CA03F, 0x76119841, 0x54CEFBDF, 0x11548AB9, 0x4B0748EB, 0x569966B1, 0x45BC721B,
00062 0x3D5A376B, 0x0D8923E9, 0x6D95514D, 0x0F39A367, 0x2FDAD92F, 0x721F972F, 0x42D0E21D, 0x5C5952DB,
00063 0x7394D007, 0x02692C55, 0x7F92772F, 0x025F8025, 0x34347113, 0x560EA689, 0x0DCC21DF, 0x09ECC7F5,
00064 0x091F3993, 0x0E0B52AB, 0x497CAA55, 0x0A040A49, 0x6D8F0CC5, 0x54F41609, 0x6E0CB8DF, 0x3DCB64C3,
00065 0x16C365CD, 0x6D6B9FB5, 0x02B9382B, 0x6A5BFAF1, 0x1669D75F, 0x13CFD4FD, 0x0FDF316F, 0x21F3C463,
00066 0x6FC58ABF, 0x04E45BE7, 0x1911225B, 0x28CD1355, 0x222084E9, 0x672AD54B, 0x476FC267, 0x6864E16D,
00067 0x20AEF4FB, 0x603C5FB9, 0x55090595, 0x1113B705, 0x24E38493, 0x5291AF97, 0x5F5446D9, 0x13A6F639,
00068 0x3D501313, 0x37E02017, 0x236B0ED3, 0x60F246BF, 0x01E02501, 0x2D2F66BD, 0x6BF23609, 0x16729BAF
00069 };
00070
00071
00072 static int
00073 i_find(const Intervals *i, int x) {
00074 ink_assert(i->n);
00075 int l = 0, h = i->n;
00076 Lrecurse:
00077 if (h <= l + 2) {
00078 if (h <= l)
00079 return -(l + 1);
00080 if (x < i->v[l] || x > i->v[l + 1])
00081 return -(l + 1);
00082 return h;
00083 }
00084 int m = (((h - l) / 4) * 2) + l;
00085 if (x > i->v[m + 1]) {
00086 l = m;
00087 goto Lrecurse;
00088 }
00089 if (x < i->v[m]) {
00090 h = m;
00091 goto Lrecurse;
00092 }
00093 return (l + 1);
00094 }
00095
00096 bool
00097 Intervals::in(int x) const {
00098 if (!n)
00099 return false;
00100 if (i_find(this, x) > 0)
00101 return true;
00102 return false;
00103 }
00104
00105
00106 void
00107 Intervals::insert(int x) {
00108 if (!n) {
00109 add(x);
00110 add(x);
00111 return;
00112 }
00113 int l = i_find(this, x);
00114 if (l > 0)
00115 return;
00116 l = -l - 1;
00117
00118 if (x > v[l + 1]) {
00119 if (x == v[l + 1] + 1) {
00120 v[l + 1]++;
00121 goto Lmerge;
00122 }
00123 l += 2;
00124 if (l < (int)n) {
00125 if (x == v[l] - 1) {
00126 v[l]--;
00127 goto Lmerge;
00128 }
00129 }
00130 goto Lmore;
00131 } else {
00132 ink_assert(x < v[l]);
00133 if (x == v[l] - 1) {
00134 v[l]--;
00135 goto Lmerge;
00136 }
00137 if (!l)
00138 goto Lmore;
00139 l -= 2;
00140 if (x == v[l + 1] + 1) {
00141 v[l + 1]++;
00142 goto Lmerge;
00143 }
00144 }
00145 Lmore:
00146 fill(n + 2);
00147 if (n - 2 - l > 0)
00148 memmove(v + l + 2, v + l, sizeof(int) * (n - 2 - l));
00149 v[l] = x;
00150 v[l+1] = x;
00151 return;
00152 Lmerge:
00153 if (l) {
00154 if (v[l] - v[l-1] < 2) {
00155 l -= 2;
00156 goto Ldomerge;
00157 }
00158 }
00159 if (l < (int)(n - 2)) {
00160 if (v[l + 2] - v[l + 1] < 2)
00161 goto Ldomerge;
00162 }
00163 return;
00164 Ldomerge:
00165 memmove(v + l + 1, v + l + 3, sizeof(int) * (n - 3 - l));
00166 n -= 2;
00167 goto Lmerge;
00168 }
00169
00170 void
00171 UnionFind::size(int s) {
00172 size_t nn = n;
00173 fill(s);
00174 for (size_t i = nn; i < n; i++)
00175 v[i] = -1;
00176 }
00177
00178 int
00179 UnionFind::find(int n) {
00180 int i, t;
00181 for (i = n; v[i] >= 0; i = v[i]);
00182 while (v[n] >= 0) {
00183 t = n;
00184 n = v[n];
00185 v[t] = i;
00186 }
00187 return i;
00188 }
00189
00190 void
00191 UnionFind::unify(int n, int m) {
00192 n = find(n);
00193 m = find(m);
00194 if (n != m) {
00195 if (v[m] < v[n]) {
00196 v[m] += (v[n] - 1);
00197 v[n] = m;
00198 } else {
00199 v[n] += (v[m] - 1);
00200 v[m] = n;
00201 }
00202 }
00203 }