Cod sursa(job #3185142)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 18 decembrie 2023 00:54:23
Problema Iv Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

ifstream fin ( "iv.in" );
ofstream fout ( "iv.out" );

const int N = 600, MOD = 3210121;

long long dp[2][N][N];
 
int main () {
    
    int n, m;
    string s1, s2;
    
    fin >> s1 >> s2;
    
    s1 = ' ' + s1;
    s2 = ' ' + s2;
    
    n = (int)s1.size() - 1;
    m = (int)s2.size() - 1;
    
    if ( s1[1] == s1[n] )
        dp[1][1][1] = 1;
    if ( s1[1] == s2[m] )
        dp[1][1][0] = 1;
    if ( s2[1] == s2[m] )
        dp[1][0][0] = 1;
    if( s2[1] == s1[n] )
        dp[1][0][1] = 1;
    
    for ( int k = 2; k <= (n + m) / 2; k++ ) {
        for( int i = 0; i <= n && i <= k; i++ ) {
            for ( int j = 0; i + j <= n && j <= k; j++ ) {
                
                if( s1[i] == s1[n - j + 1] && i >= 1 && n - j + 1 <= n )
                    dp[k % 2][i][j] += dp[(k - 1) % 2][i - 1][j - 1];
                
                if( s1[i]==s2[m - k + j + 1] && i >= 1 && m - k + j + 1 <= m )
                    dp[k % 2][i][j] += dp[(k - 1) % 2][i - 1][j];
                
                if( s2[k - i] == s1[n - j + 1] && k - i >= 1 && n - j + 1 <= n )
                    dp[k % 2][i][j] += dp[(k - 1) % 2][i][j - 1];
                
                if( s2[k - i] == s2[m - k + j + 1] && k - i >= 1 && m - k + j + 1 <= m )
                    dp[k % 2][i][j] += dp[(k - 1) % 2][i][j];
                
                dp[k % 2][i][j] %= MOD;
            }
        }
    }
    
    long long ans = 0;
    
    if ( ( n + m ) % 2 == 0 ) {
        for ( int i = 0; i <= n; i++ )
            ans = (ans + dp[((n + m) / 2) % 2][i][n - i]) % MOD;
    }
    
    else {
        for ( int i = 0; i <= n; i++ )
            ans = ( ans + dp[((n + m) / 2) % 2][i][n - i] + dp[((n + m) / 2) % 2][i][n - i - 1] ) % MOD;
    }
    
    fout << ans;
    
    return 0;
}