Cod sursa(job #586964)

Utilizator bacilaBacila Emilian bacila Data 3 mai 2011 17:07:48
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
using namespace std;
inline int maxi(int a, int b)
{if(a>b) return a;
return b;}
int a[1005][1005],n,m,i,j,p,k,T,x,nxt1[1005][28],nxt2[1005][28];
char rez[1005],s1[1005],s2[1005],st[1005];
int main ()
{ifstream f("seif.in");
ofstream g("seif.out");
f>>T;
for(x=1;x<=T;x++)
{f>>k>>s1>>s2;
n=strlen(s1)-1;
m=strlen(s2)-1;
for(i=0;i<=n+1;i++)
a[i][m+1]=0;
for(i=0;i<=m+1;i++)
a[n+1][i]=0;
for(i=0;i<=n+1;i++)
for(j=0;j<=26;j++)
nxt1[i][j]=-1;
for(i=0;i<=m+1;i++)
for(j=0;j<=26;j++)
nxt2[i][j]=-1;
for(i=n;i>=0;i--)
for(j=m;j>=0;j--)
if(s1[i]==s2[j])
a[i][j]=a[i+1][j+1]+1;
else
a[i][j]=maxi(a[i+1][j],a[i][j+1]);
for(i=n;i>=0;--i)
for(j='A';j<='Z';++j)
if(s1[i]==j)
nxt1[i][j-'A']=i;
else
nxt1[i][j-'A']=nxt1[i+1][j-'A'];
for(i=m;i>=0;--i)
for(j='A';j<='Z';++j)
if(s2[i]==j)
nxt2[i][j-'A']=i;
else
nxt2[i][j-'A']=nxt2[i+1][j-'A'];
i=j=0;
for(;k>=0||(i<=n&&j<=m);--k)
{
for(p=25;p>=0;--p)
if(nxt1[i][p]>=0&&nxt2[j][p]>=0&&a[nxt1[i][p]][nxt2[j][p]]>=k)
{
g<<(char)(p+'A');
i=nxt1[i][p]+1,j=nxt2[j][p]+1;
break;
}
if(p<0)
break;
}
g<<"\n";
}


f.close();
  g.close();
return 0;
}