Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define sc( x ) scanf( "%d" , &x )
- #define REP( i , n ) for( int i = 0 ; i < n ; i++ )
- #define clr( t , val ) memset( t , val , sizeof(t) )
- #define all(v) v.begin() , v.end()
- #define pb push_back
- #define SZ( v ) ((int)v.size())
- #define mp make_pair
- #define fi first
- #define se second
- #define N 1000000
- #define MOD 1000000007
- #define INF (1<<29)
- typedef long long ll;
- typedef vector< int > vi;
- typedef vector< ll > vll;
- int n;
- string S;
- bool used1[ N + 5 ][ 3 ];
- int memo1[ N + 5 ][ 3 ];
- int dp1( int pos , int last ){
- if( pos == n ) return 0;
- if( used1[ pos ][ last ] ) return memo1[ pos ][ last ];
- used1[ pos ][ last ] = 1;
- int &dev = memo1[ pos][ last ] = INF;
- if( S[ pos ] == '*' ){
- REP( i , 2 ) dev = min( dev , (last == i) + dp1( pos + 1 , i ) );
- }else if( S[ pos ] == 'A' ){
- dev = min( dev , (last == 0) + dp1( pos + 1 , 0 ) );
- }else{
- dev = min( dev , (last == 1) + dp1( pos + 1 , 1 ) );
- }
- return dev;
- }
- bool used2[ N + 5 ][ 3 ];
- int memo2[ N + 5 ][ 3 ];
- int dp2( int pos , int last ){
- if( pos == n ) return 1;
- if( used2[ pos ][ last ] ) return memo2[ pos ][ last ];
- used2[ pos ][ last ] = 1;
- int &dev = memo2[ pos ][ last ] = 0;
- if( S[ pos ] == '*' ){
- REP( i , 2 ) {
- if( dp1( pos , last ) == (last == i) + dp1( pos + 1 , i ) )
- dev += dp2( pos + 1 , i );
- }
- }else if( S[ pos ] == 'A' ){
- if( dp1( pos , last ) == (last == 0) + dp1( pos + 1 , 0 ) )
- dev += dp2( pos + 1 , 0 );
- }else{
- if( dp1( pos , last ) == (last == 1) + dp1( pos + 1 , 1 ) )
- dev += dp2( pos + 1 , 1 );
- }
- if( dev >= MOD ) dev -= MOD;
- return dev;
- }
- class TaroFillingAStringDiv1 {
- public:
- int getNumber(int nn, vector <int> position, string value) {
- n = nn;
- S = string( n , '*' );
- REP( i , SZ( position ) ) S[ --position[ i ] ] = value[ i ];
- clr( used1 , 0 );
- dp1( 0 , 2 );
- clr( used2 , 0 );
- //cout << dp1( 0 , 2 ) << endl;
- return dp2( 0 , 2 );
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment