Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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;
}
Пример #5
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;
	}
}