Pagini recente » Cod sursa (job #1084575) | Cod sursa (job #856324) | Cod sursa (job #2349970) | Cod sursa (job #528100) | Cod sursa (job #476810)
Cod sursa(job #476810)
#include <fstream>
#include <cstring>
#define M 666013
#define maxim(a, b) ((a > b) ? a : b)
using namespace std;
string a,b;
int sir1[501][27],sir2[501][27],m,n,i,j,ii,jj;
int c[501][501],nr[501][501],k;
int main()
{
ifstream fi("subsir.in");
ofstream fo("subsir.out");
getline(fi,a);
getline(fi,b);
m=a.size(); n=b.size();
for(i=1;i<=m;i++)
for(j=1;j<=26;j++) if(a[i-1]==j+96) sir1[i][j]=i; else sir1[i][j]=sir1[i-1][j];
for(i=1;i<=n;i++)
for(j=1;j<=26;j++) if(b[i-1]==j+96) sir2[i][j]=i; else sir2[i][j]=sir2[i-1][j];
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if (a[i-1] == b[j-1])
c[i][j] = 1 + c[i-1][j-1];
else
c[i][j] = maxim(c[i-1][j], c[i][j-1]);
if(a[i-1]==b[j-1])
{
for(k=1;k<=26;k++)
{
ii=sir1[i-1][k];
jj=sir2[j-1][k];
if((!ii)||(!jj)) continue;
if(c[i][j]==c[ii][jj]+1) nr[i][j]+=nr[ii][jj];
}
if(!nr[i][j]) nr[i][j]=1;
}
}
fo<<nr[m][n]<<"\n";
return 0;
}