Cod sursa(job #562673)

Utilizator bora_marianBora marian bora_marian Data 23 martie 2011 17:45:00
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<fstream>
#include<cstring>
#define DIM 1003
using namespace std;
char s1[DIM],s2[DIM];
int poz1[DIM][DIM],poz2[DIM][DIM],best[DIM][DIM],t,n,m,k;
int main()
{
	ifstream fin("seif.in");
	freopen("seif.out","wt",stdout);
	fin>>t;
	while(t--)
	{
		fin>>k;
		fin.get();
		fin.getline(s1,DIM);
		fin.getline(s2,DIM);
		n=strlen(s1)-1;
		m=strlen(s2)-1;
		int i,j;
		for(i=0;i<=n+1;++i)
		    for(j=0;j<=m+1;++j)
			    best[i][j]=0;
	for(i=0;i<=n+1;++i)
		for(int j=0;j<26;++j)
			poz1[i][j]=poz2[i][j]=-1;
    for(i=0;i<=m+1;++i)
		for(int j=0;j<26;++j)
			poz1[i][j]=poz2[i][j]=-1;
   
		for(i=n;i>=0;i--)
		    for(j=m;j>=0;j--)
			if (s1[i]==s2[j])
				best[i][j]=best[i+1][j+1]+1;
			else
				best[i][j]=max(best[i+1][j],best[i][j+1]);
	for(int i=n;i+1;--i)
		for(int j=0;j<26;++j)
			if (s1[i]-'A'==j)
				poz1[i][j]=i;
			else
				poz1[i][j]=poz1[i+1][j];
	for(int i=m;i+1;--i)
		for(int j=0;j<26;++j)
			if (s2[i]-'A'==j)
				poz2[i][j]=i;
			else
				poz2[i][j]=poz2[i+1][j];  
		 i=j=0;
		 for(;i!=-1 && j!=-1;k--)
		 {
			 int kk;
			 for(kk=25;kk>=0;kk--)
			    if(poz1[i][kk]!=-1 && poz2[j][kk]!=-1 && best[poz1[i][kk]][poz2[j][kk]]>=k)
			      { 
			         printf("%c",kk+'A');
			         i=poz1[i][kk]+1;
			         j=poz2[j][kk]+1;
			         break;
				   }
			  if(kk==-1)
			     break;
			 } 
			printf("\n");   
		 }
}