Cod sursa(job #3137938)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 16 iunie 2023 10:02:07
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
//Ilie Dumitru
#include<cstdio>
#include<cstring>
const int NMAX=512;
const int MOD=3210121;

char s[2][NMAX];
int dp[2][NMAX][NMAX];
int len[2];

bool isPalind(char* start, char* end)
{
	while(start<end)
	{
		if(*start!=*end)
			return 0;
		++start;
		--end;
	}
	return 1;
}

int main()
{
	FILE* f=fopen("iv.in", "r"), *g=fopen("iv.out", "w");
	//FILE* f=stdin, *g=stdout;
	int i, j, k, l, step, nstep, ans=0;

	for(i=0;i<2;++i)
	{
		fgets(s[i], NMAX, f);
		len[i]=strlen(s[i]);
		if(s[i][len[i]-1]=='\n')
			s[i][--len[i]]=0;
	}

	dp[0][0][0]=1;
	for(i=0;i<=len[0];++i)
	{
		step=i&1;
		nstep=!step;
		for(j=0;i+j<=len[0];++j)
		{
			for(k=0;k<=len[1];++k)
			{
				l=i+k-j;
				if(l>-1 && k+l<=len[1] && dp[step][j][k])
				{
					if(i+j==len[0])
					{
						if(isPalind(s[1]+k, s[1]+len[1]-l-1))
							ans=(ans+dp[step][j][k])%MOD;
					}
					else if(k+l==len[1])
					{
						if(isPalind(s[0]+i, s[0]+len[0]-j-1))
							ans=(ans+dp[step][j][k])%MOD;
					}
					else
					{
						if(i+j!=len[0]-1 && s[0][i]==s[0][len[0]-j-1])
							dp[nstep][j+1][k]=(dp[nstep][j+1][k]+dp[step][j][k])%MOD;
						if(k+l!=len[1]-1 && s[1][k]==s[1][len[1]-l-1])
							dp[step][j][k+1]=(dp[step][j][k+1]+dp[step][j][k])%MOD;
						if(s[0][i]==s[1][len[1]-l-1])
							dp[nstep][j][k]=(dp[nstep][j][k]+dp[step][j][k])%MOD;
						if(s[1][k]==s[0][len[0]-j-1])
							dp[step][j+1][k+1]=(dp[step][j+1][k+1]+dp[step][j][k])%MOD;

						if(len[0]-i-j+len[1]-k-l<2)
							ans=(ans+dp[step][j][k])%MOD;
					}
					dp[step][j][k]=0;
				}
			}
		}
	}

	fprintf(g, "%d", ans);

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