Pagini recente » Cod sursa (job #989444) | Cod sursa (job #1472258) | Cod sursa (job #2913841) | Cod sursa (job #2623620) | Cod sursa (job #61380)
Cod sursa(job #61380)
using namespace std;
#include <stdio.h>
#include <string.h>
#define max(x,y) ((x>y)?(x):(y))
int dp[81][81],nexta[80][26],nextb[80][26],sol;
void construct(int i, int j, int len, char out[81]) {
int k;
if (len == dp[0][0]) {
out[len] = 0;
sol++;
return;
}
for (k=0; k<26; k++) {
int a=nexta[i][k],b=nextb[j][k];
if (a>=0 && b>=0 && (!len && dp[a-1][b-1] == dp[0][0] || dp[a-1][b-1] == dp[i-1][j-1]-1)) {
out[len] = k+'a';
construct(a,b,len+1,out);
}
}
}
int main() {
int i,j,n,m;
char s1[240],s2[240],out[81];
freopen("subsir.in","r",stdin);
freopen("subsir.out","w",stdout);
gets(s1);
gets(s2);
n = strlen(s1);
m = strlen(s2);
for (i=0; i<=n; i++)
dp[i][m] = 0;
for (j=0; j<=m; j++)
dp[n][j] = 0;
for (i=n-1; i>=0; --i)
for (j=m-1; j>=0; --j)
if (s1[i] == s2[j])
dp[i][j] = dp[i+1][j+1]+1;
else
dp[i][j] = max(dp[i][j+1],dp[i+1][j]);
for (i=0; i<n; i++) {
for (j=0; j<26; j++)
nexta[i][j] = -1;
for (j=i; j<n; j++)
if (nexta[i][s1[j]-'a']<0)
nexta[i][s1[j]-'a'] = j+1;
}
for (i=0; i<m; i++) {
for (j=0; j<26; j++)
nextb[i][j] = -1;
for (j=i; j<m; j++)
if (nextb[i][s2[j]-'a']<0)
nextb[i][s2[j]-'a'] = j+1;
}
construct(0,0,0,out);
printf("%d",sol);
return 0;
}