Cod sursa(job #1860732)

Utilizator hrazvanHarsan Razvan hrazvan Data 28 ianuarie 2017 12:40:26
Problema Lampa Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#define MAXM 3027197
#define MAXF 75025
char s[MAXM + 2];
char v[2][MAXF], dv[2];
int p1, l1, p2, l2, pr1, lr1, pr2, lr2;

inline void concat(int a, int b){
  int i;
  for(i = 0; i < dv[b]; i++){
    v[a][dv[a] + i] = v[b][i];
  }
  dv[a] += dv[b];
}

inline char maimic(int p1, int l1, int p2, int l2){
  int i;
  for(i = 0; i < l1 && i < l2; i++){
    if(s[p1 + i] < s[p2 + i])
      return 1;
    if(s[p1 + 1] > s[p2 + i])
      return 0;
  }
  if(l1 < l2)
    return 1;
  return 0;
}

inline char verif(int a, int b, int n, int l){
  if(n & 1){
    p1 = 0;
    l1 = a;
    p2 = a;
    l2 = b;
  }
  else{
    p1 = b;
    l1 = a;
    p2 = 0;
    l2 = b;
  }
  int i, j, k;
  j = 0;
  for(i = 0; i < dv[l]; i++){
    if(v[l][i] == 0){
      for(k = 0; k < l1; k++)
        if(s[j++] != s[p1 + k])
          return 0;
    }
    else{
      for(k = 0; k < l2; k++){
        if(s[j++] != s[p2 + k])
          return 0;
      }
    }
  }
  return 1;
}

int main(){
  FILE *in = fopen("lampa.in", "r");
  int n, m, i, j, a, b, l;
  char g = 0;
  fscanf(in, "%d%d ", &n, &m);
  fgets(s, MAXM + 2, in);
  fclose(in);
  v[0][0] = 0;
  v[1][0] = 1;
  dv[0] = dv[1] = 1;
  for(i = 2; i < n; i++){
    concat(i & 1, !(i & 1));
    if(i == n - 2){
      a = dv[!(i & 1)];
      b = dv[i & 1];
    }
  }
  l = !(i & 1);
  for(i = 1; i * b < m; i++){
    j = (m - i * b) / a;
    if(i * b + j * a == m){
      if(verif(j, i, n, l)){
        if(!g || (g && maimic(p1, l1, pr1, lr1))){
          g = 1;
          pr1 = p1;
          lr1 = l1;
          pr2 = p2;
          lr2 = l2;
        }
      }
    }
  }
  FILE *out = fopen("lampa.out", "w");
  if(!g)
    fprintf(out, "0");
  else{
    for(i = pr1; i < pr1 + lr1; i++)
      fputc(s[i], out);
    fputc('\n', out);
    for(i = pr2; i < pr2 + lr2; i++)
      fputc(s[i], out);
    fputc('\n', out);
  }
  fclose(out);
  return 0;
}