LCP build_lcp(const Simulator * sim, const Discretizer * disc, double gamma, bool include_oob, bool value_nonneg){ cout << "Generating transition matrices..."<< endl; vector<sp_mat> E_blocks = build_E_blocks(sim,disc, gamma,include_oob); sp_mat M = build_M(E_blocks); vec q = build_q_vec(sim,disc,gamma,include_oob); assert(q.n_elem == M.n_rows); assert(q.n_elem == M.n_cols); if(value_nonneg) return LCP(M,q); uint A = sim->num_actions(); uint N; if(include_oob) N= disc->number_of_all_nodes(); else N= disc->number_of_spatial_nodes(); bvec free_vars = zeros<bvec>((A+1)*N); assert(size(q) == size(free_vars)); free_vars.head(N).fill(1); return LCP(M,q,free_vars); }
LCP smooth_lcp(const sp_mat & smoother, const vector<sp_mat> & blocks, const mat & Q, const bvec & free_vars){ uint n = smoother.n_rows; assert(n == smoother.n_cols); uint A = blocks.size(); uint N = n*(A+1); assert(A >= 1); assert(size(n,n) == size(blocks.at(0))); assert(size(n,A+1) == size(Q)); assert(N == free_vars.n_elem); // Smooth blocks vector<sp_mat> sblocks = block_rmult(smoother,blocks); // Smooth Q mat sQ = mat(size(Q)); sQ.col(0) = Q.col(0); // State weights unchanged sQ.tail_cols(A) = smoother * Q.tail_cols(A); sp_mat M = build_M(sblocks); vec q = vectorise(sQ); return LCP(M,q,free_vars); }
LCP augment_lcp(const LCP & original, vec & x, vec & y, double scale){ cout << "Scale: " << scale << endl; uint N = original.q.n_elem; x = ones<vec>(N); y = ones<vec>(N); y(find(1 == original.free_vars)).fill(0); vec r = y - (original.M * x + original.q); // Initial residual //[M r] //[0 s] sp_mat M = sp_mat(N+1,N+1); M(span(0,N-1),span(0,N-1)) = original.M; M(span(0,N-1),N) = r; M(N,N) = scale; vec q = vec(N+1); q.head(N) = original.q; q(N) = 0; x.resize(N+1); x(N) = 1; y.resize(N+1); y(N) = scale; // New variable is non-negative; all others same. bvec free_vars = bvec(N+1); free_vars.head(N) = original.free_vars; free_vars(N) = 0; return LCP(M,q,free_vars); }
int main() { #warning READ FROM FILES!!!! // freopen( "cadena.in", "r", stdin ); // freopen( "cadena.out", "w", stdout ); while ( scanf( "%s", &words[N] ) && words[N][0] != '.' ) len[N] = strlen( words[N] ), N++; for ( i = N - 1; i >= 0; i-- ) { lcp[i] = LCP( i, i + 1 ); for ( j = i + 1; j < N && lcp[j] >= lcp[i]; j = next[j] ); next[i] = j; } for ( i = 0; i < N; i++ ) { cant[i]++; if ( lcp[i] < len[i] ) cant[i + 1]--; else cant[ next[i] + 1 ]--; if ( i ) cant[i] += cant[i - 1]; if ( cant[i] > cant[pos] ) pos = i; } last = pos; sol[sol_count++] = pos; for ( i = pos - 1; i >= 0; i-- ) if ( LCP( i, last ) == len[i] ) { last = i; sol[sol_count++] = i; } for ( i = sol_count - 1; i >= 0; i-- ) printf( "%s\n", words[ sol[i] ] ); fflush( stdout ); return 0; }
int main() { freopen("encrypt.in","r",stdin); freopen("force2.out","w",stdout); scanf("%s",s+1); n=strlen(s+1); power[0]=1; for(int i=1;i<=n;i++) h[i]=h[i-1]*base+s[i]-'a'+1,power[i]=power[i-1]*base; for(int i=1;i<=n;) { int len=0,pos=0; for(int j=1;j<i;j++) { int k=LCP(j,i); if(k>len) len=k,pos=j; } if(!len) printf("%d %d ",-1,s[i]),i++; else printf("%d %d ",len,pos-1),i+=len; } }