Pagini recente » Cod sursa (job #2949531) | Cod sursa (job #1793380) | Cod sursa (job #132090) | Cod sursa (job #3206885) | Cod sursa (job #1684538)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct eu{int val,x,y;};
eu a[501][501];
struct eu2{char s[501];};
eu2 v[1001];
int i,j,n,m,k,maxim,cate;
char s[501],s1[501],s2[501];
void creez(char vec[501],int x,int y,int maxim1)
{
int i,j;
i=x;
j=y;
if(maxim1==0)
{
cate++;
for(i=1;i<=maxim;i++)
v[cate].s[i]=vec[maxim-i+1];
}
else
{
int aux;
while(a[i][j].val==a[a[i][j].x][a[i][j].y].val)
{
aux=i;
i=a[i][j].x;
j=a[aux][j].y;
}
vec[maxim-maxim1+1]=s[i];
creez(vec,i-1,j-1,maxim1-1);
}
}
bool sorting(eu2 a,eu2 b)
{
int i;
for(i=1;i<=maxim;i++)
{
if(a.s[i]<b.s[i])
return 1;
if(a.s[i]>b.s[i])
return 0;
}
return 1;
}
int main ()
{
freopen("subsir.in","r",stdin);
freopen("subsir.out","w",stdout);
gets(s);
gets(s1);
n=strlen(s);
m=strlen(s1);
for(i=n;i>=1;i--)
s[i]=s[i-1];
for(i=m;i>=1;i--)
s1[i]=s1[i-1];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(s[i]==s1[j])
{
if(a[i-1][j-1].val+1>=a[i-1][j].val&&a[i-1][j-1].val+1>=a[i][j-1].val)
{
a[i][j].val=a[i-1][j-1].val+1;
a[i][j].x=i-1;
a[i][j].y=j-1;
}
else
if(a[i-1][j].val>a[i][j-1].val)
{
a[i][j].val=a[i-1][j].val;
a[i][j].x=i-1;
a[i][j].y=j;
}
else
{
a[i][j].val=a[i][j-1].val;
a[i][j].x=i;
a[i][j].y=j-1;
}
}
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j].val>maxim)
maxim=a[i][j].val;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j].val==maxim&&a[i-1][j-1].val<maxim)
{
s2[1]=s[i];
creez(s2,i-1,j-1,maxim-1);
}
sort(v+1,v+cate+1,sorting);
int nr=0;
for(i=1;i<=cate;i++)
{
int pp=0;
for(j=1;j<=maxim;j++)
if(v[i].s[j]!=v[i-1].s[j])
{
pp=1;
break;
}
if(pp==0)
nr++;
}
printf("%d",nr);
return 0;
}