Pagini recente » Cod sursa (job #41539) | Cod sursa (job #1767738) | Cod sursa (job #52814) | Cod sursa (job #1174042) | Cod sursa (job #874772)
Cod sursa(job #874772)
#include<fstream>
#include<string.h>
using namespace std;
#define M 505
#define MOD 666013
#define lit 30
ifstream f("subsir.in");
ofstream g("subsir.out");
int n, m, c[M][M], d[M][M], ia[M][lit], ib[M][lit];
char a[M], b[M];
int maxim(int x, int y)
{
if(x>y) return x;
else return y;
}
int main()
{
f >>a>>b;
n = strlen(a);
m = strlen(b);
a[n++] = '0';
b[m++] = '0';
for(int i = 0; i < n; i++)
{
for(int j = 0; j < lit; j++)
ia[i][j] = ia[i - 1][j];
ia[i][a[i] - 'a'] = i;
}
for(int i = 0; i < m; i++)
{
for(int j = 0; j < lit; j++)
ib[i][j] = ib[i - 1][j];
ib[i][b[i] - 'a'] = i;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(a[i] == b[j])
c[i][j] = c[i - 1][j - 1] + 1;
else
c[i][j] = maxim(c[i - 1][j], c[i][j - 1]);
d[0][0] = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(c[i][j] == 1)
{
d[i][j] = 1;
}
for(int k = 0 ;k < lit; k++)
{
int ii = ia[i - 1][k];
int jj = ib[j - 1][k];
if(c[i][j] == c[ii][jj] + 1)
{
d[i][j] += d[ii][jj];
d[i][j] %= MOD;
}
}
}
g << d[n][m];
return 0;
}