Cod sursa(job #3122107)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 17 aprilie 2023 11:27:25
Problema Subsir Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
//Ilie Dumitru
#include<cstdio>
#include<cstring>
const int NMAX=512;

struct trie
{
	trie* sons[26];

	trie()
	{
		int i;

		for(i=0;i<26;++i)
			this->sons[i]=0;
	}
	~trie()
	{
		int i;

		for(i=0;i<26;++i)
			if(this->sons[i])
				delete this->sons[i];
	}
};

int N, M;
int max[NMAX][NMAX];
char s[2][NMAX];
trie* t=0;

void dp()
{
	int i, j;

	N=strlen(s[0]+1);
	if(s[0][N]=='\n')
		s[0][N--]=0;
	M=strlen(s[1]+1);
	if(s[1][M]=='\n')
		s[1][M--]=0;

	for(i=1;i<=N;++i)
		for(j=1;j<=M;++j)
		{
			if(s[0][i]==s[1][j])
				max[i][j]=max[i-1][j-1]+1;
			else if(max[i-1][j]>max[i][j-1])
				max[i][j]=max[i-1][j];
			else
				max[i][j]=max[i][j-1];
		}
}

void add(trie*& t, int i, int j)
{
	if(!t)
		t=new trie();
	if(max[i][j])
	{
		if(s[0][i]==s[1][j])
			add(t->sons[s[0][i]-'a'], i-1, j-1);
		if(max[i][j]==max[i-1][j])
			add(t, i-1, j);
		if(max[i][j]==max[i][j-1])
			add(t, i, j-1);
	}
}

int cnt(trie* t)
{
	if(!t)
		return 0;
	int i, ans=0;
	for(i=0;i<26;++i)
		ans+=cnt(t->sons[i]);
	return ans+!ans;
}

int main()
{
	FILE* f=fopen("subsir.in", "r"), *g=fopen("subsir.out", "w");
	//FILE* f=stdin, *g=stdout;

	fgets(s[0]+1, NMAX, f);
	fgets(s[1]+1, NMAX, f);

	dp();
	add(t, N, M);
	fprintf(g, "%d\n", cnt(t));

	fclose(f);
	fclose(g);
	return 0;
}