Submission #340437


Source Code Expand

/**
 * A - ニコニコ文字列2
 *
 * http://dwango2015-honsen.contest.atcoder.jp/tasks/dwango2015_finals_1
 *
 */

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>

const int MAX_PASSWORD_LENTH = 252;
const int MAX_REQUIRED_NICO_PATTERNS = 252;

int password_length = 0;
int required_nico_patterns = 0;
std::string input_string;

long long int dp[ MAX_PASSWORD_LENTH ][ MAX_REQUIRED_NICO_PATTERNS + 1 ][ MAX_PASSWORD_LENTH ];

/**
 * 条件を満たすパスワードのパターン数を再帰的にカウントする
 *
 * @param n 文字列の現在のインデックス
 * @param m 現在までに出現しているニコニコ文字列パターン数 ( ただし上限 required_nico_patterns )
 * @param o 現在まで連続しているニコニコ文字列の文字数
 */
long long int count_password_pattern_recursive( int n, int m, int o )
{
	// std::cout << "(" << n << "," << m << "," << o << ")" << std::endl;
	
	if ( n == input_string.size() )
	{
		return m >= required_nico_patterns ? 1 : 0;
	}
	
	if ( m >= required_nico_patterns )
	{
		m = required_nico_patterns;
	}
	
	if ( dp[ n ][ m ][ o ] >= 0 )
	{
		return dp[ n ][ m ][ o ];
	}
	
	long long int password_patterns = 0;
	
	if ( input_string[ n ] == '2' && o % 2 == 0 )
	{
		password_patterns = count_password_pattern_recursive( n + 1, m, o + 1 );
	}
	else if ( input_string[ n ] == '5' && o % 2 == 1 )
	{
		password_patterns = count_password_pattern_recursive( n + 1, m + ( o + 1 ) / 2, o + 1 );
	}
	else if ( input_string[ n ] == '?' )
	{
		for ( int x = 0; x < 10; x++ )
		{
			if ( x == 2 && o % 2 == 0 )
			{
				password_patterns += count_password_pattern_recursive( n + 1, m, o + 1 );
			}
			else if ( x == 5 && o % 2 == 1 )
			{
				password_patterns += count_password_pattern_recursive( n + 1, m + ( o + 1 ) / 2, o + 1 );
			}
			else
			{
				password_patterns += count_password_pattern_recursive( n + 1, m, x == 2 );
			}
			
			password_patterns %= 1000000007;
		}
	}
	else
	{
		password_patterns = count_password_pattern_recursive( n + 1, m, input_string[ n ] == '2' );
	}
	
	dp[ n ][ m ][ o ] = password_patterns % 1000000007;
	
	return dp[ n ][ m ][ o ];
}

int main( int argc, char** argv )
{
	memset( dp, 0xFF, sizeof( dp ) );
	
	std::cin >> password_length >> required_nico_patterns;
	std::cin >> input_string;
	
	std::cout << count_password_pattern_recursive( 0, 0, 0 ) << std::endl;
	
    return 0;
}

Submission Info

Submission Time
Task A - ニコニコ文字列2
User jepupu
Language C++ (G++ 4.6.4)
Score 20
Code Size 2523 Byte
Status AC
Exec Time 557 ms
Memory 126316 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 20 / 20
Status
AC × 2
AC × 22
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_20.txt, subtask1_21.txt, subtask1_22.txt
Case Name Status Exec Time Memory
sample_01.txt AC 290 ms 126312 KB
sample_02.txt AC 291 ms 126308 KB
subtask1_01.txt AC 290 ms 126308 KB
subtask1_02.txt AC 290 ms 126312 KB
subtask1_03.txt AC 292 ms 126316 KB
subtask1_04.txt AC 293 ms 126308 KB
subtask1_05.txt AC 291 ms 126312 KB
subtask1_06.txt AC 288 ms 126316 KB
subtask1_07.txt AC 287 ms 126304 KB
subtask1_08.txt AC 305 ms 126312 KB
subtask1_09.txt AC 291 ms 126312 KB
subtask1_10.txt AC 290 ms 126312 KB
subtask1_11.txt AC 288 ms 126316 KB
subtask1_12.txt AC 289 ms 126312 KB
subtask1_13.txt AC 294 ms 126312 KB
subtask1_14.txt AC 291 ms 126304 KB
subtask1_15.txt AC 305 ms 126312 KB
subtask1_16.txt AC 303 ms 126312 KB
subtask1_17.txt AC 557 ms 126312 KB
subtask1_18.txt AC 287 ms 126308 KB
subtask1_19.txt AC 480 ms 126308 KB
subtask1_20.txt AC 306 ms 126312 KB
subtask1_21.txt AC 292 ms 126312 KB
subtask1_22.txt AC 289 ms 126316 KB