Cod sursa(job #150660)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 7 martie 2008 11:01:48
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.09 kb
#include <stdio.h>  
#include <string.h>  
#define MAX 1011
int Case,N, M, K, A[MAX][MAX], T[MAX], ok[MAX];
char S1[MAX], S2[MAX], Sir[MAX], temp[MAX];
int main(){  
     int i, j, nq, l, t, x, y, p, q, md;
     freopen("seif.in", "r", stdin);  
     freopen("seif.out", "w", stdout);
     scanf("%d", &Case);
     while (Case--){
            memset(S1,'\0',sizeof(S1));
            memset(S2,'\0',sizeof(S2));
            scanf("%d", &K);  
            scanf(" ");
            gets(S1);
            scanf(" ");
            gets(S2);
            N = strlen(S1); M = strlen(S2);
            for (i = 0; i < N; i++) temp[i] = S1[N-i-1];  
            for (i = 0; i < N; i++) S1[i] = temp[i];  
            for (i = 0; i < M; i++) temp[i] = S2[M-i-1];  
            for (i = 0; i < M; i++) S2[i] = temp[i];
            memset(A,0,sizeof(A));
            memset(T,0,sizeof(T));
            memset(temp,'\0',sizeof(temp));
            memset(Sir,'\0',sizeof(Sir));
            for (i = 1; i <= N; i++)  
             for (j = 1; j <= M; j++)  
                 if (S1[i-1]==S2[j-1])
					 A[i][j] = A[i-1][j-1]+1;
                 else{  
                     A[i][j] = A[i][j-1];  
                     if (A[i][j]<A[i-1][j]) A[i][j] = A[i-1][j];  
                 }
            nq = x = t = y = 0;
            memset(ok,0,sizeof(ok));
            memset(T,0,sizeof(T));
            for (i = N; i > 0; i--)
               for (j = M; j > 0; j--)
               if (!ok[j-1] && S1[i-1]==S2[j-1])
               {
                   if (nq==0) {
                      x = 0;
                      if (A[i][j]>=K) 
						  t = 1;
                      else 
						  t = 0;
                      }
                   else{
					   x = nq;
					   t = 0;
					   p = 0;
					   q = nq-1;
					   while (p<=q){
                                md = (p+q)>>1;
                                if ((T[md]<j-1)&&(A[i][j]+md >= K)) q = md-1;
                                else p = md+1;
                       }
					   x = q;
                       if (x<0) 
						   x = 0;
					   if ( (T[x] >= j-1)||(A[i][j]+x < K) )
						   x++;
                       if ( (x>0)&&(T[x-1] < j-1)&&(A[i][j]+x >= K) ) 
						   x--;
					   if (x>0&&T[x-1] < j-1)
						   continue;
					   if (x>0&&Sir[x]<S1[i-1])
						   t = 1;
					   while ( (x>0) && (A[i][j]+x-1 >= K) && (Sir[x-1] < S1[i-1]) )
						   x--, t = 1;
					   if ( (x==0&&Sir[0]<S1[i-1])||( (x==nq)&&(T[x-1] > j-1) ) )
						   t = 1;
                       if (A[i][j]+x < K)
						   t = 0;
                       if (t==1)
                          for (l = nq-1; l >= x; l--)
							  ok[ T[l] ] = 0;
                   }
                   if (t){
                      Sir[x] = S1[i-1], T[x++] = j-1;
                      nq = x;
                      ok[j-1] = 1;
                      break;
                   }
               }
			   for (l = 0; l < nq; l++)
            {  
                 printf("%c", Sir[l]);
                 Sir[l] = '\0';  
            }  
            printf("\n");
	 }
	 return 0;
}