Cod sursa(job #150657)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 7 martie 2008 10:56:15
Problema Seif Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.45 kb
#include<stdio.h>   
#include<string.h>   
#define N 1005   
int t,test,n,m,K,v[N][N],T[N],ok[N],i,j,nq,l,x,y,p,q,md;;   
char s1[N],s2[N],Sir[N],temp[N];   
int main(){   
    freopen("seif.in", "r", stdin);   
    freopen("seif.out", "w", stdout);   
    scanf("%d",&test);   
    while(test--){   
        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(v,0,sizeof(v));   
        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])   
                    v[i][j]=v[i-1][j-1]+1;   
            else{   
                v[i][j] = v[i][j-1];   
                if(v[i][j]<v[i-1][j])   
                    v[i][j]=v[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(v[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)&&(v[i][j]+md>=K))   
                                q=md-1;   
                            else  
                                p=md+1;   
                       }   
                    x=q;   
                    if(x<0)   
                        x=0;   
                    if((T[x]>=j-1)||(v[i][j]+x<K))   
                        x++;   
                    if((x>0)&&(T[x-1]<j-1)&&(v[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)&&(v[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(v[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;   
}