Advertisement
SuitNdtie

Char-print

Oct 3rd, 2019
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. /*
  2. LANG: C++
  3. TASK: charprint
  4. */
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7.  
  8. typedef long long int ll;
  9.  
  10. int const N = 300010;
  11. ll fenwicktree[N];
  12.  
  13. void update(ll x){
  14.     for(int i = x ; i <= N ; i += (i&-i)){
  15.         fenwicktree[i]++;
  16.     }
  17. }
  18.  
  19. ll query(ll x){
  20.     ll sum = 0;
  21.     for(int i = x ; i >= 1 ; i -= (i&-i)){
  22.         sum += fenwicktree[i];
  23.     }
  24.     return sum;
  25. }
  26.  
  27.  
  28. int main()
  29. {
  30.     int mode;
  31.     scanf("%d",&mode);
  32.     char field[N];
  33.     char key[100010];
  34.     scanf(" %s",field);
  35.     scanf(" %s",key);
  36.    
  37.     deque<ll> allchar[260];
  38.     for(ll i = 0 ; field[i] != '\0'; i ++)
  39.         allchar[field[i]-'a'].push_back(i);
  40.    
  41.    
  42.     ll cost = 0;
  43.     if(mode == 0){
  44.         for(int i = 0 ; key[i] != '\0' ; i ++){
  45.             char kc = key[i];
  46.             if(allchar[kc-'a'].size() > 0){
  47.             //  printf("At %c Test cost : %d = %d + %d\n",kc,cost + allchar[kc-'a'][0],cost,allchar[kc-'a'][0]);
  48.                 cost += allchar[kc-'a'][0]+1;
  49.                 allchar[kc-'a'].pop_front();
  50.             }
  51.             else{
  52.                 printf("-1");
  53.                 return 0;
  54.             }
  55.         }
  56.     }
  57.     else {
  58.         for(int i = 0 ; key[i] != '\0' ; i ++){
  59.             char kc = key[i];
  60.             if(allchar[kc-'a'].size() > 0){
  61.             //  printf("Char %c at %d Test cost : %d = %d + (%d - %d)\n",kc,allchar[kc-'a'][0],cost + allchar[kc-'a'][0]+1 - query(allchar[kc-'a'][0]),cost,allchar[kc-'a'][0]+1,query(allchar[kc-'a'][0]));
  62.                 cost += allchar[kc-'a'][0]+1 - query(allchar[kc-'a'][0]);
  63.                 update(allchar[kc-'a'][0]+1);
  64.                 allchar[kc-'a'].pop_front();
  65.                
  66.             //  printf("Test query : ");for(int j = 0 ; j <= 20 ; j ++)printf("%d ",query(j));printf("\n");
  67.             }
  68.             else{
  69.                 printf("-1");
  70.                 return 0;
  71.             }
  72.         }
  73.     }
  74.     printf("%lld",cost);
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement