Pagini recente » Cod sursa (job #548607) | Cod sursa (job #671265) | Cod sursa (job #395903) | Cod sursa (job #2395471) | Cod sursa (job #874721)
Cod sursa(job #874721)
#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 + 1)>> (b + 1);
n = strlen(a + 1);
m = strlen(b + 1);
a[n++] = '/0';
b[m++] = '/0';
for(int i = 1; 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 = 1; 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 = 1; i <= n; i++)
for(int j = 1; 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 = 1; i <= n; i++)
for(int j = 1; 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;
}