Cod sursa(job #246330)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 20 ianuarie 2009 17:39:20
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <string>
#define min(a,b) ((a<b)?a:b)
#define N 10005
long n,m,i,j,t,x,pmin,pmax,P2,lg[N],l[N],ind[N],ind2[N],v[N],rm[16][N];
char ch[2048],*a[10005];

long rmq(long x,long y){  
  return min( rm[ lg[y-x+1] ] [x], rm[ lg[y-x+1] ] [y-(1<<(lg[y-x+1]))+1] );  
}
long asemenea(int x, int y){
  int i,K=min(l[x],l[y]);
  for (i=0;i<K;++i)if (a[x][i]!=a[y][i])break;
return i;
}
int comp(const void * n1, const void * n2){
  return strcmp(a[*((long*)n1)],a[*((long*)n2)]);
}

int main(){
  freopen("ratina.in","r",stdin);
  freopen("ratina.out","w",stdout);
  scanf("%ld %ld\n",&n,&m);
  for (i=1;i<=n;++i){
    scanf("%s\n",ch); l[i]=strlen(ch);
    ind[i]=i;
    a[i]=new char [l[i]+1]; strcpy(a[i],ch);
  }
  qsort(ind+1,n,sizeof(long),comp);
  for (i=1;i<=n;++i)ind2[ind[i]]=i;
  for (i=1;i<n;++i)v[i]=asemenea(ind[i],ind[i+1]);
  //preprocesare
  n--;
  for (i=1;i<=n;++i)
     rm[0][i]=v[i]; //initializare pt 2^0
  for (i=2;i<=n;++i)
     lg[i]=lg[i>>1]+1;   //vector de logaritmi 
  while ((long)(1<<P2+1)<=n)P2++; //cea mai mare putere a lui 2 mai mica decat n
    for (j=n;j;j--)  
      for (i=1 ; i<=P2 && j+(1<<i)<=n+1 ; i++)
        rm[i][j]=min(rm[i-1][j],rm[i-1][j+(1<<(i-1))]);
  //query
  for (;m;--m){
    scanf("%ld",&t);
    pmin=n+2;pmax=0;
    for (;t;--t){
      scanf("%ld",&x);
      if (ind2[x]>pmax)pmax=ind2[x];
      if (ind2[x]<pmin)pmin=ind2[x];
    }
    if (pmax!=pmin)printf("%ld\n",rmq(pmin,pmax-1));
    else printf("%ld\n",l[x]);
  }
return 0;
}