int solve_spiro(spiro_seg *s, int nseg) { bandmat *m; double *v; int *perm; int nmat = count_vec(s, nseg); int n_alloc = nmat; double norm; int i; if (nmat == 0) return 0; if (s[0].ty != '{' && s[0].ty != 'v') n_alloc *= 3; if (n_alloc < 5) n_alloc = 5; m = (bandmat *)malloc(sizeof(bandmat) * n_alloc); v = (double *)malloc(sizeof(double) * n_alloc); perm = (int *)malloc(sizeof(int) * n_alloc); for (i = 0; i < 10; i++) { norm = spiro_iter(s, m, perm, v, nseg); #ifdef VERBOSE printf("%% norm = %g\n", norm); #endif if (norm < 1e-12) break; } free(m); free(v); free(perm); return 0; }
int longestPalindrome(string s) { vector<int> count_vec(58, 0); for(char c: s) { ++count_vec[c - 'A']; } int odd = 0; int result = 0; for(int x: count_vec) { odd |= x; result += x >> 1; } result <<= 1; result += odd & 1; return result; }
static int solve_spiro(spiro_seg *s, int nseg) { int i, converged, nmat, n_alloc; bandmat *m; double *v; int *perm; double norm; nmat = count_vec(s, nseg); n_alloc = nmat; if (nmat == 0) return 1; /* just means no convergence problems */ if (s[0].ty != '{' && s[0].ty != 'v') n_alloc *= 3; if (n_alloc < 5) n_alloc = 5; m = (bandmat *)malloc(sizeof(bandmat) * n_alloc); v = (double *)malloc(sizeof(double) * n_alloc); perm = (int *)malloc(sizeof(int) * n_alloc); i = converged = 0; /* not solved (yet) */ if ( m!=NULL && v!=NULL && perm!=NULL ) { while (i++ < 60) { norm = spiro_iter(s, m, perm, v, nseg, nmat); #ifdef VERBOSE printf("iteration #%d, %% norm = %g\n", i, norm); #endif if (check_finiteness(s, nseg)) break; if (norm < 1e-12) { converged = 1; break; } } #ifdef VERBOSE if (converged==0) fprintf(stderr, "ERROR: LibSpiro: failed to converge after %d attempts to converge.\n", i); } else { fprintf(stderr, "ERROR: LibSpiro: failed to alloc memory.\n"); #endif } free(m); free(v); free(perm); return converged; }
int main() { std::string line; while (std::getline(std::cin, line)) { size_t size; void* addrlist[16]; int r = sscanf( line.data(), "malloc_tracker ### profile " "%zu %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p\n", &size, &addrlist[0], &addrlist[1], &addrlist[2], &addrlist[3], &addrlist[4], &addrlist[5], &addrlist[6], &addrlist[7], &addrlist[8], &addrlist[9], &addrlist[10], &addrlist[11], &addrlist[12], &addrlist[13], &addrlist[14], &addrlist[15]); if (r != 17) continue; for (size_t i = 0; i < 16; ++i) { if (!addrlist[i]) break; count_map[Entry { addrlist[i], i, size }]++; } } std::vector<EntrySize> count_vec(count_map.begin(), count_map.end()); std::sort(count_vec.begin(), count_vec.end()); for (size_t i = count_vec.size() - 10000; i < count_vec.size(); ++i) { const EntrySize& es = count_vec[i]; std::cout << es.second << '\t' << es.first.size << '\t' << es.first.ptr << '\t' << es.first.depth << '\n'; } return 0; }
static double spiro_iter(spiro_seg *s, bandmat *m, int *perm, double *v, int n) { int cyclic = s[0].ty != '{' && s[0].ty != 'v'; int i, j, jj; int nmat = count_vec(s, n); double norm; int n_invert; for (i = 0; i < nmat; i++) { v[i] = 0.; for (j = 0; j < 11; j++) m[i].a[j] = 0.; for (j = 0; j < 5; j++) m[i].al[j] = 0.; } j = 0; if (s[0].ty == 'o') jj = nmat - 2; else if (s[0].ty == 'c') jj = nmat - 1; else jj = 0; for (i = 0; i < n; i++) { char ty0 = s[i].ty; char ty1 = s[i + 1].ty; int jinc = compute_jinc(ty0, ty1); double th = s[i].bend_th; double ends[2][4]; double derivs[4][2][4]; int jthl = -1, jk0l = -1, jk1l = -1, jk2l = -1; int jthr = -1, jk0r = -1, jk1r = -1, jk2r = -1; compute_pderivs(&s[i], ends, derivs, jinc); /* constraints crossing left */ if (ty0 == 'o' || ty0 == 'c' || ty0 == '[' || ty0 == ']') { jthl = jj++; jj %= nmat; jk0l = jj++; } if (ty0 == 'o') { jj %= nmat; jk1l = jj++; jk2l = jj++; } /* constraints on left */ if ((ty0 == '[' || ty0 == 'v' || ty0 == '{' || ty0 == 'c') && jinc == 4) { if (ty0 != 'c') jk1l = jj++; jk2l = jj++; } /* constraints on right */ if ((ty1 == ']' || ty1 == 'v' || ty1 == '}' || ty1 == 'c') && jinc == 4) { if (ty1 != 'c') jk1r = jj++; jk2r = jj++; } /* constraints crossing right */ if (ty1 == 'o' || ty1 == 'c' || ty1 == '[' || ty1 == ']') { jthr = jj; jk0r = (jj + 1) % nmat; } if (ty1 == 'o') { jk1r = (jj + 2) % nmat; jk2r = (jj + 3) % nmat; } add_mat_line(m, v, derivs[0][0], th - ends[0][0], 1, j, jthl, jinc, nmat); add_mat_line(m, v, derivs[1][0], ends[0][1], -1, j, jk0l, jinc, nmat); add_mat_line(m, v, derivs[2][0], ends[0][2], -1, j, jk1l, jinc, nmat); add_mat_line(m, v, derivs[3][0], ends[0][3], -1, j, jk2l, jinc, nmat); add_mat_line(m, v, derivs[0][1], -ends[1][0], 1, j, jthr, jinc, nmat); add_mat_line(m, v, derivs[1][1], -ends[1][1], 1, j, jk0r, jinc, nmat); add_mat_line(m, v, derivs[2][1], -ends[1][2], 1, j, jk1r, jinc, nmat); add_mat_line(m, v, derivs[3][1], -ends[1][3], 1, j, jk2r, jinc, nmat); j += jinc; } if (cyclic) { memcpy(m + nmat, m, sizeof(bandmat) * nmat); memcpy(m + 2 * nmat, m, sizeof(bandmat) * nmat); memcpy(v + nmat, v, sizeof(double) * nmat); memcpy(v + 2 * nmat, v, sizeof(double) * nmat); n_invert = 3 * nmat; j = nmat; } else { n_invert = nmat; j = 0; } /* #define VERBOSE */ #ifdef VERBOSE for (i = 0; i < n; i++) { int k; for (k = 0; k < 11; k++) printf(" %2.4f", m[i].a[k]); printf(": %2.4f\n", v[i]); } printf("---\n"); #endif bandec11(m, perm, n_invert); banbks11(m, perm, v, n_invert); norm = 0.; for (i = 0; i < n; i++) { char ty0 = s[i].ty; char ty1 = s[i + 1].ty; int jinc = compute_jinc(ty0, ty1); int k; for (k = 0; k < jinc; k++) { double dk = v[j++]; #ifdef VERBOSE printf("s[%d].ks[%d] += %f\n", i, k, dk); #endif s[i].ks[k] += dk; norm += dk * dk; } } return norm; }