Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. typedef vector<vector<int> > VV;
  10. typedef vector<int> V;
  11.  
  12. void outv (VV & v)
  13. {
  14.     for(int i=0;i<v.size();i++)
  15.     {
  16.         if(i!=0)
  17.             {
  18.                 cout<<"||";
  19.             }
  20.         for(int j=0;j<v[i].size();j++)
  21.         {
  22.  
  23.             if(j!=0)
  24.             {
  25.                 cout<<"&";
  26.             }
  27.             if(v[i][j]<0)
  28.             {
  29.                 cout<<"!";
  30.             }
  31.             cout<<"x"<<abs(v[i][j]);
  32.         }
  33.     }
  34. }
  35.  
  36. int mystoi(string & s)
  37. {
  38.     int a=0;
  39.     int d=1;
  40.     for(int i=s.length()-1; i>=0; i--)
  41.     {
  42.         a+=((int)s[i]-48)*d;
  43.         d*=10;
  44.     }
  45. //cout«"a="«a«endl;
  46.     return a;
  47. }
  48.  
  49. V pars(string & s)
  50. {
  51.     V v1;
  52.     int h = 1;
  53.     string s1 = "";
  54.     for(int i=0; i<s.size(); i++)
  55.     {
  56. //cout«"i="«i«" s[i]="«s[i]«endl;
  57.         if(s[i] == '!')
  58.         {
  59.             h = -1;
  60.         }
  61.         else if(s[i] >= '0' && s[i] <= '9')
  62.         {
  63. //cout«"s[i]="«s[i]«endl;
  64.             s1 += s[i];
  65.         }
  66.         else if(s[i] == '&')
  67.         {
  68. //cout«"s1="«s1«endl;
  69.             v1.push_back(mystoi(s1)*h);
  70.             s1 = "";
  71.             h = 1;
  72.         }
  73.     }
  74.     v1.push_back(mystoi(s1)*h);
  75.     return v1;
  76. }
  77.  
  78. bool cmp_rule_1(V & v1,V & v2)
  79. {
  80.     if(v1.size() != v2.size())
  81.     {
  82.         return false;
  83.     }
  84.     int g = 0;
  85.     for(int i=0;i<v1.size();i++)
  86.     {
  87.         int h = 0;
  88.         for(int j=0;j<v2.size();j++)
  89.         {
  90.             if(v1[i] == v2[j])
  91.             {
  92.                 h = 1;break;
  93.             }
  94.             else
  95.             {
  96.                 if(abs(v1[i]) == abs(v2[j]))
  97.                 {
  98.                     h = 2;break;
  99.                 }
  100.             }
  101.         }
  102.         if(h == 0)
  103.         {
  104.             return false;
  105.         }
  106.         if(h == 2)
  107.         {
  108.             g++;
  109.         }
  110.     }
  111.     if(g == 1)
  112.     {
  113.         return true;
  114.     }
  115.     else
  116.     {
  117.         return false;
  118.     }
  119. }
  120.  
  121. bool cmp_rule_2(V & v1, V & v2)
  122. {
  123.     if(v1.size() == v2.size())
  124.     {
  125.         return false;
  126.     }
  127.     for(int i=0; i<v1.size(); i++)
  128.     {
  129.         if(find(v2.begin(), v2.end(), v1[i]) == v2.end())
  130.         {
  131.             return false;
  132.         }
  133.     }
  134.     return true;
  135. }
  136.  
  137. V gluing(V & v1 , V & v2)
  138. {
  139.     V v;
  140.     for(int i=0; i<v1.size(); i++)
  141.     {
  142.         if(find(v2.begin(), v2.end(), v1[i]) != v2.end())
  143.         {
  144.             v.push_back(v1[i]);
  145.         }
  146.     }
  147.     return v;
  148. }
  149.  
  150. void reduction (VV & v)
  151. {
  152.     for(int i=0;i<v.size();i++)
  153.     {
  154.         for(int j=i+1;j<v.size();j++)
  155.         {
  156.             int g=1;
  157.             for(int k=0;k<v[i].size();k++)
  158.             {
  159.                 int h=0;
  160.                 for(int l=0;l<v[j].size();l++)
  161.                 {
  162.                     if(v[i][k] == v[j][l])
  163.                     {
  164.                         h=1;
  165.                         break;
  166.                     }
  167.                 }
  168.                 if(h==0)
  169.                 {
  170.                     g=0;
  171.                     break;
  172.                 }
  173.             }
  174.             if(g==1)
  175.             {
  176. //                outv(v);
  177. //                cout<<"i="<<i<<" j="<<j<<" reduction"<<'\n';
  178.                 v.erase(v.begin()+j);
  179.                 j--;
  180.             }
  181.         }
  182.     }
  183. }
  184.  
  185. int main()
  186. {
  187.     freopen("tests.txt","r",stdin);
  188.     freopen("output.txt","w",stdout);
  189.     VV v;
  190.     char c;
  191.     string s = "";
  192.     while (cin>>c)
  193.     {
  194.         if(c == '|')
  195.         {
  196. //cout«"s="«s«endl;
  197.             v.push_back(pars(s));
  198.             s = "";
  199.             cin>>c;
  200.         }
  201.         else
  202.         {
  203.             s += c;
  204.         }
  205.     }
  206.     v.push_back(pars(s));
  207. //==========================input-OK!===========================//
  208.     int h = 1;
  209.     while(h != 0)
  210.     {
  211.         VV v1;
  212.         h = 0;
  213.         for(int i=0; i<v.size(); i++)
  214.         {
  215.             int l=0;
  216.             for(int j=i+1; j<v.size(); j++)
  217.             {
  218.                 if(cmp_rule_1(v[i],v[j]))
  219.                 {
  220. //                    vector<int>v2=gluing(v[i],v[j]);;
  221. //                    cout<<"i="<<i<<" j="<<j<<" gluing=";
  222. //                    for(int k =0;k<v2.size();k++)
  223. //                    {
  224. //                        cout<<v2[k]<<" ";
  225. //                    }
  226. //                    cout<<'\n';
  227.                     v1.push_back(gluing(v[i],v[j]));
  228.                     l++;
  229.                     h++;
  230.                 }
  231.             }
  232.             if(l == 0)
  233.             {
  234.                 v1.push_back(v[i]);
  235.             }
  236.         }
  237.         if(h != 0)
  238.         {
  239.             v=v1;
  240.         }
  241.     }
  242.     while(h != 0)
  243.     {
  244.         for(int i=0; i<v.size(); i++)
  245.         {
  246.             for(int j=i+1; j<v.size(); j++)
  247.             {
  248.                 if(cmp_rule_2(v[i],v[j]))
  249.                 {
  250.                     //outv(v);
  251.                     //cout<<"i="<<i<<" j="<<j<<" absorption";
  252.                     //cout<<'\n';
  253.                     v.erase(v.begin()+j);
  254.                     j--;
  255.                     h++;
  256.                 }
  257.                 else if(cmp_rule_2(v[j],v[i]))
  258.                 {
  259.                     v.erase(v.begin()+i);
  260.                     h++;
  261.                     i--;
  262.                     break;
  263.                 }
  264.             }
  265.         }
  266.     }
  267.     reduction(v);
  268.     outv(v);
  269.     return 0;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement