Advertisement
Guest User

Untitled

a guest
Aug 29th, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. #define ll              long long
  10. #define dd              double
  11. #define vv              vector
  12. #define pb              push_back
  13. #define forn( i, n )    for( ll i = 0; i < (ll) (n); i ++ )
  14. #define MOD             1000000021
  15. #define PR              37
  16. #define endl            '\n'
  17.  
  18. string num;
  19. ll numm[111];
  20. ll st[111];
  21. string s[51111];
  22. ll ss[511111][111];
  23. char c[26] = {
  24.     '2', '2', '2', '3', '3', '3', '4', '4', '1', '1', '5', '5', '6', '6', '0', '7', '0', '7', '7', '8', '8', '8', '9', '9', '9', '0'
  25. //   a    b    c    d    e    f    g    h    i    j    k    l    m    n    o    p    q    r    s    t    u    v    w    x    y    z
  26. };
  27. vector< ll > v[111];
  28. vector< ll > ans;
  29. ll M;
  30.  
  31. void f( string x, ll * a ) {
  32.     a[0] = x[0] - '0';
  33.     forn( i, x.size() ) {
  34.         if( i == 0 )
  35.             continue;  
  36.         a[i] = ( a[i - 1] * PR + x[i] - '0' ) % MOD;
  37.     }
  38. }
  39.  
  40. bool rec( ll i, ll j, ll m, bool r ) {
  41.     if( m > M ) {
  42.         return false;  
  43.     }
  44.     i += s[j].size();
  45.     if( i == num.size() ) {
  46.         M = min( M, m );
  47.         return r && M == m;
  48.     }
  49.     forn( k, v[i].size() ) {
  50.         if( rec( i, v[i][k], m + 1, r ) ) {
  51.             ans.pb( v[i][k] );
  52.             return true;   
  53.         }  
  54.     }
  55.     return false;
  56. }
  57.  
  58. int main() {
  59.     //cerr << (int) 'Z' << " " << (int) 'a' << endl;
  60.     forn( i, 111 ) {
  61.         if( i == 0 )
  62.             st[i] = PR;
  63.         else
  64.             st[i] = ( st[i - 1] * PR ) % MOD;  
  65.    
  66.     }
  67.     cin >> num;
  68.     while( num != "-1" ) {
  69.         f( num, numm );
  70.         //forn( i, num.size() ) {
  71.             //cerr << numm[i] << endl; 
  72.         //}
  73.         ll n;
  74.         cin >> n;
  75.         forn( i, num.size() )
  76.             v[i].clear();
  77.         ans.clear();
  78.         M = num.size() + 1;
  79.         forn( i, n ) {
  80.             cin >> s[i];
  81.             string w = "";
  82.             forn( j, s[i].size() ) {
  83.                 if( s[i][j] >= 'a' )
  84.                     w += c[s[i][j] - 'a'];
  85.                 else
  86.                     w += c[s[i][j] - 'A'];
  87.             }
  88.             f( w, ss[i] );
  89.             //cerr << w << endl;
  90.             ll b = ss[i][s[i].size() - 1];
  91.             forn( j, num.size() - s[i].size() + 1 ) {
  92.                 ll a = numm[j + s[i].size() - 1];
  93.                 if( j != 0 )
  94.                     a = ( a - numm[j - 1] * st[s[i].size() - 1] % MOD + MOD ) % MOD;
  95.                 //cerr << b << " " << a << endl;
  96.                 if( a == b )
  97.                     v[j].pb( i );
  98.             }
  99.         }  
  100.         forn( i, v[0].size() ) {
  101.             rec( 0, v[0][i], 1, false );
  102.         }
  103.         if( M <= num.size() ) {
  104.             forn( i, v[0].size() ) {
  105.                 if( rec( 0, v[0][i], 1, true ) ) {
  106.                     ans.pb( v[0][i] );
  107.                     break; 
  108.                 }  
  109.             }
  110.             forn( i, ans.size() )
  111.                 cout << s[ans[ans.size() - 1 - i]] << " ";
  112.         } else {
  113.             cout << "No solution.";
  114.         }
  115.         cout << endl;
  116.         cin >> num;    
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement