Cod sursa(job #2586315)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 20 martie 2020 15:06:25
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ( "iv.in" );
ofstream g ( "iv.out" );
char s1[502], s2[502];
const int MOD = 3210121;
int dp[3][502][502];
int main()
{
    f >> s1 + 1 >> s2 + 1;
    int l1 = strlen ( s1 + 1 ), l2 = strlen ( s2 + 1 ), rez = 0;
    dp[0][0][0] = 1;

    for ( int i = 0; i <= l1; i++ )
        for ( int j = 0; j + i <= l1; j++ )
            for ( int k = 0; k <= l2; k++ )
            {
                int l = i - j + k;

                if ( l < 0 || l + k > l2 )
                    continue;

                if ( ( i + j + k + l ) == ( l2 + l1 - 1 ) || ( i + j + k + l ) == ( l2 + l1 ) )
                    rez = ( rez + dp[i % 2][j][k] ) % MOD;
                else
                {
                    if ( s1[i + 1] == s1[l1 - j] )
                        dp[ ( i + 1 ) % 2][j + 1][k] = ( dp[ ( i + 1 ) % 2][j + 1][k] + dp[i % 2][j][k] ) % MOD;

                    if ( s2[k + 1] == s2[l2 - l] )
                        dp[ i % 2][j][k + 1] = ( dp[i % 2][j][k + 1] + dp[i % 2][j][k] ) % MOD;

                    if ( s1[i + 1] == s2[l2 - l] )
                        dp[ ( i + 1 ) % 2][j][k] = ( dp[ ( i + 1 ) % 2][j][k] + dp[i % 2][j][k] ) % MOD;

                    if ( s1[l1 - j] == s2[k + 1] )
                        dp[ i % 2][j + 1][k + 1] = ( dp[i % 2][j + 1][k + 1] + dp[i % 2][j][k] ) % MOD;
                }

                dp[i % 2][j][k] = 0;
            }

    g << rez;
    return 0;
}