Advertisement
Guest User

Izraz, od Vasja

a guest
Apr 23rd, 2014
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <cstdio>
  7. #include <sstream>
  8. using namespace std;
  9.  
  10. string niza[251];
  11. int closing[251];
  12. int n;
  13.  
  14. void remove_brackets(string &x,int s,int e,int znak)
  15. {
  16.   int i=s;
  17.   while(i<e)
  18.   {
  19.     if((x[i]>='0' && x[i]<='9') || x[i]=='?')
  20.       i++;
  21.     if(x[i]=='-' && x[i+1]!='(')
  22.     {
  23.       if(znak==1) x[i]='+';
  24.       i++;
  25.     }
  26.     if(x[i]=='+' && x[i+1]!='(')
  27.     {
  28.       if(znak==1) x[i]='-';
  29.       i++;
  30.     }
  31.  
  32.     if(x[i]=='-' && x[i+1]=='(')
  33.     {
  34.       remove_brackets(x,i+2,closing[i+1]-1,(znak+1)%2 );
  35.       if(znak==1) x[i]='+';
  36.       i=closing[i+1]+1;
  37.     }
  38.  
  39.      if(x[i]=='+' && x[i+1]=='(')
  40.     {
  41.       remove_brackets(x,i+2,closing[i+1]-1,znak );
  42.       if(znak==1) x[i]='-';
  43.       i=closing[i+1]+1;
  44.     }
  45.   }
  46. }
  47.  
  48. void split(string x)
  49. {
  50.  n=0;
  51.  int j=0;
  52.  string next="";
  53.  while(j<x.size())
  54.  {
  55.     if((x[j]>='0' && x[j]<='9') || x[j]=='?')
  56.     {
  57.       while((x[j]>='0' && x[j]<='9') || x[j]=='?')
  58.       {
  59.         next+=x[j];
  60.         j++;
  61.       }
  62.       niza[n++]=next;
  63.       next="";
  64.     }
  65.     if(x[j]=='(' || x[j]==')')
  66.       j++;
  67.     if(x[j]=='-' || x[j]=='+')
  68.     {
  69.       niza[n++]=x[j++];
  70.     }
  71.  }
  72. }
  73.  
  74.  
  75. void replace_with_digits(string d)
  76. {
  77.   int i,j,k;
  78.   int changeI;
  79.   int dig;
  80.   int temp;
  81.   bool chk=true;
  82.   bool vis[250];
  83.   memset(vis,false,sizeof(vis));
  84.  
  85.   for(j=d.size()-1;j>=0;j--)
  86.   {
  87.     changeI=-1;
  88.     dig=0;
  89.     temp=0;
  90.     for(i=0;i<n;i+=2)
  91.     {
  92.       if(i==0 || niza[i-1]=="+")
  93.       {
  94.         for(k=niza[i].size()-1;k>=0;k--)
  95.         {
  96.           if(niza[i][k]=='?' && niza[i].size()-k>temp)
  97.           {
  98.             temp=niza[i].size()-k;
  99.             dig=k;
  100.             changeI=i;
  101.           }
  102.         }
  103.       }
  104.     }
  105.     if(changeI==-1) break;
  106.     vis[j]=true;
  107.     niza[changeI][dig]=d[j];
  108.   }
  109.  
  110.   for(j=0;j<d.size();j++)
  111.   {
  112.     if(vis[j]) continue;
  113.     changeI=-1;
  114.     dig=0;
  115.     temp=0;
  116.     for(i=0;i<n;i+=2)
  117.     {
  118.       if(i>0 && niza[i-1]=="-")
  119.       {
  120.         for(k=niza[i].size()-1;k>=0;k--)
  121.         {
  122.           if(niza[i][k]=='?' && niza[i].size()-k>temp)
  123.           {
  124.             temp=niza[i].size()-k;
  125.             dig=k;
  126.             changeI=i;
  127.           }
  128.         }
  129.       }
  130.     }
  131.     if(changeI==-1) break;
  132.     vis[j]=true;
  133.     niza[changeI][dig]=d[j];
  134.   }
  135. }
  136.  
  137. int toInt(string x)
  138. {
  139.   istringstream is(x);
  140.   int a;
  141.   is>>a;
  142.   return a;
  143. }
  144. int sumAll()
  145. {
  146.   int res=0;
  147.  
  148.   for(int i=0;i<n;i+=2)
  149.   {
  150.     if(i==0 || niza[i-1]=="+")
  151.       res+=toInt(niza[i]);
  152.     else res-=toInt(niza[i]);
  153.   }
  154.   return res;
  155. }
  156. int main()
  157. {
  158.     string x;
  159.     string d;
  160.     int i,j;
  161.     stack<int> s;
  162.     cin>>x;
  163.     cin>>d;
  164.  
  165.  
  166.  
  167.     for(i=0;i<x.size();i++)
  168.     {
  169.       if(x[i]=='(')
  170.          s.push(i);
  171.       if(x[i]==')')
  172.       {
  173.         closing[s.top()]=i;
  174.         s.pop();
  175.       }
  176.     }
  177.  
  178.     remove_brackets(x,0,x.size()-1,0);
  179.     split(x);
  180.     sort(d.begin(),d.end());
  181.  
  182.     replace_with_digits(d);
  183.     cout<<sumAll()<<endl;
  184.  
  185. //    cout<<endl;
  186. //    cout<<endl<<x<<endl;
  187. //    for(i=0;i<n;i++)
  188. //      cout<<niza[i]<<" ";
  189.  
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement