BoxerTC

Untitled

Feb 17th, 2015
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; i++ )
  6. #define clr( t , val ) memset( t , val , sizeof(t) )
  7.  
  8. #define all(v)  v.begin() , v.end()
  9. #define pb push_back
  10. #define SZ( v ) ((int)v.size())
  11.  
  12. #define mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define N 1000000
  17. #define MOD 1000000007
  18. #define INF (1<<29)
  19.  
  20. typedef long long ll;
  21. typedef vector< int > vi;
  22. typedef vector< ll > vll;
  23.  
  24. int n;
  25. string S;
  26. bool used1[ N + 5 ][ 3 ];
  27. int memo1[ N + 5 ][ 3 ];
  28. int dp1( int pos , int last ){
  29.     if( pos == n ) return 0;
  30.     if( used1[ pos ][ last ] ) return memo1[ pos ][ last ];
  31.     used1[ pos ][ last ] = 1;
  32.     int &dev = memo1[ pos][ last ] = INF;
  33.     if( S[ pos ] == '*' ){
  34.         REP( i , 2 ) dev = min( dev , (last == i) + dp1( pos + 1 , i ) );
  35.     }else if( S[ pos ] == 'A' ){
  36.         dev = min( dev , (last == 0) + dp1( pos + 1 , 0 ) );
  37.     }else{
  38.         dev = min( dev , (last == 1) + dp1( pos + 1 , 1 ) );
  39.     }
  40.     return dev;
  41. }
  42. bool used2[ N + 5 ][ 3 ];
  43. int memo2[ N + 5 ][ 3 ];
  44. int dp2( int pos , int last ){
  45.     if( pos == n ) return 1;
  46.     if( used2[ pos ][ last ] ) return memo2[ pos ][ last ];
  47.     used2[ pos ][ last ] = 1;
  48.     int &dev = memo2[ pos ][ last ] = 0;
  49.     if( S[ pos ] == '*' ){
  50.         REP( i , 2 ) {
  51.             if( dp1( pos , last ) == (last == i) + dp1( pos + 1 , i ) )
  52.                 dev += dp2( pos + 1 , i );
  53.         }
  54.     }else if( S[ pos ] == 'A' ){
  55.         if( dp1( pos , last ) == (last == 0) + dp1( pos + 1 , 0 ) )
  56.             dev += dp2( pos + 1 , 0 );
  57.     }else{
  58.         if( dp1( pos , last ) == (last == 1) + dp1( pos + 1 , 1 ) )
  59.             dev += dp2( pos + 1 , 1 );
  60.     }
  61.     if( dev >= MOD ) dev -= MOD;
  62.     return dev;
  63. }
  64. class TaroFillingAStringDiv1 {
  65. public:
  66.     int getNumber(int nn, vector <int> position, string value) {
  67.         n = nn;
  68.         S = string( n , '*' );
  69.         REP( i , SZ( position ) ) S[ --position[ i ] ] = value[ i ];
  70.         clr( used1 , 0 );
  71.         dp1( 0 , 2 );
  72.         clr( used2 , 0 );
  73.         //cout << dp1( 0 , 2 ) << endl;
  74.         return dp2( 0 , 2 );
  75.     }
  76. };
Advertisement
Add Comment
Please, Sign In to add comment