Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <vector>
  5. #include <map>
  6. using namespace std;
  7.  
  8.  
  9. struct v{
  10.     string str;
  11.     int idx;
  12.     vector<int> sep;
  13. };
  14.  
  15.  
  16. vector<v> list[2000];
  17. map<string,string> gsb;
  18. map<string,int> vv;
  19. int n;
  20.  
  21. int common(string a, string b,int st){
  22.     int sa=a.size();
  23.     int sb=b.size();
  24.     if(sa - st> sb -1 ){
  25.         st = sa - sb + 1;
  26.     }
  27.     for(int i=st,t = sa - st;i<sa;i++,t--){
  28.         bool is_match=true;
  29.         for(int j=i,k=0;j<sa;j++,k++){
  30.             if(a[j] != b[k]){
  31.                 is_match=false;
  32.                 break;
  33.             }
  34.         }
  35.         if(is_match){
  36.             return t;
  37.         }
  38.     }
  39.     return 0;
  40. }
  41.  
  42. string reduce_gsb(string a){
  43.     while(true){
  44.         bool found=false;
  45.         int n=a.size();
  46.         for(int i=0;i<n;i++){
  47.             for(int j=i;j<n;j++){
  48.                 int len = j- i + 1;
  49.                 if(gsb.count(a.substr(i,len))){
  50.                     string t = a.substr(0,i) + gsb[a.substr(i,len)] + a.substr(j+1,n - j);
  51.                     a=t;
  52.                     found=true;
  53.                     break;
  54.                 }
  55.             }
  56.             if(found)break;
  57.         }
  58.         if(!found){
  59.             break;
  60.         }
  61.     }
  62.     return a;
  63. }
  64. string result="";
  65. void divide(int n,vector<string> parts,int pos,string res_left,string res_right,int sign);
  66. void mult(int n,vector<string> parts,string res_left,string res_right,int sign,int exception){
  67.    
  68.     int sg = 1;
  69.     vector<string> tmp=parts;
  70.     tmp.erase(tmp.begin());
  71.     divide(n,tmp,0,res_left+parts[0],res_right,sign * sg);
  72.     sg *= -1;
  73.     int n_part= parts.size();
  74.     for(int i=0;i<n_part - 1 ;i++){
  75.         if(i == exception){
  76.             sg *= -1;
  77.             continue;
  78.         }
  79.         string g = parts[i] + parts[i+1];
  80.         g = reduce_gsb(g);
  81.         tmp = parts;
  82.         tmp.erase(tmp.begin()+i);
  83.         tmp.erase(tmp.begin()+i);
  84.         tmp.insert(tmp.begin()+i,g);
  85.         divide(n,tmp,i,res_left,res_right,sign* sg);
  86.         sg *= -1;
  87.     }
  88.     tmp = parts;
  89.     tmp.pop_back();
  90.     divide(n,tmp,n_part-2,res_left, parts[n_part-1] + res_right ,sign* sg);
  91.     sg *= -1;
  92. }
  93.  
  94. void divide(int n,vector<string> parts,int pos,string res_left,string res_right,int sign){
  95.     string str="";
  96.     for(int i=0;i<parts.size();i++){
  97.         str += parts[i];
  98.     }
  99.     int sg ;
  100.     if(pos % 2 == 0)sg = 1;
  101.     else sg = -1;
  102.     if(vv.count(str) && vv[str] == n-1){
  103.         if(sign == -1){
  104.             result += "-";
  105.         } else{
  106.             result += "+";
  107.         }
  108.         result += res_left+"["+str+"]"+res_right;
  109.         return;
  110.     }
  111.     int ln = parts[pos].length();
  112.     str = "";
  113.     for(int i=0;i<pos;i++){
  114.         str += parts[i];
  115.     }
  116.     bool found=false;
  117.     for(int i=1;i<ln;i++){
  118.         string tmp=str + parts[pos].substr(0,i);
  119.        
  120.         if(vv.count(tmp) && vv[tmp] == pos){
  121.             tmp = parts[pos].substr(i,ln -i);
  122.             parts[pos]=  parts[pos].substr(0,i);
  123.             parts.insert(parts.begin()+  pos+1,tmp);
  124.             found=true;
  125.             break;
  126.         }
  127.     }
  128.     if(found){
  129.         mult(n,parts,res_left,res_right,sign * sg,pos);
  130.     }
  131. }
  132. int N;
  133. int main(){
  134.     cout<<"Enter N:"<<endl;
  135.     cin>>N;
  136.     cout<<"Enter number of elements of X"<<endl;
  137.     cin>>n;
  138.     cout<<"Enter elements of X space-separated"<<endl;
  139.     for(int i=0;i<n;i++){
  140.         v h;
  141.         cin>>h.str;
  142.         h.idx = 0;
  143.         list[0].push_back(h);
  144.         vv[h.str]= 0;
  145.     }
  146.     cout<<"Enter number of elements in GSB"<<endl;
  147.     cin>>n;
  148.     cout<<"Enter elements of GSB, in each line one element having two space-separated strings"<<endl;
  149.     for(int i=0;i<n;i++){
  150.         string a,b;
  151.         cin>>a>>b;
  152.         if(b=="1")b="";
  153.         gsb[a]=b;
  154.         v h;
  155.         h.str = a;
  156.         h.sep.push_back(0);
  157.         h.idx = 1;
  158.         list[1].push_back(h);
  159.         vv[h.str] = 1;
  160.     }
  161.     for(int i=1;i<N;i++){
  162.         for(int j =0;j<list[i].size();j++){
  163.             for(int k=0;k<list[1].size();k++){
  164.                 int h= common(list[i][j].str,list[1][k].str,list[i][j].sep.back()+1);
  165.                 if(h ==0)continue;
  166.                 v u= list[i][j];
  167.                 u.idx += 1;
  168.                 u.sep.push_back(u.str.size()-1);
  169.                 int sb =list[1][k].str.size();
  170.                 u.str += list[1][k].str.substr(h,sb-h);
  171.                 list[i+1].push_back(u);
  172.                 vv[u.str] = u.idx;
  173.             }
  174.         }
  175.     }
  176.     cout<<"Elements of V"<<N<<" are: "<<endl;
  177.     for(int j=0;j<list[N].size();j++){
  178.         cout<<"V"<<N<<"["<<j<<"]: "<<list[N][j].str<<endl;
  179.     }
  180.     cout<<"Enter the index of element of you want to calculate its function"<<endl;
  181.     int ind;
  182.     cin>>ind;
  183.     vector<string> parts;
  184.     vector<int> sep = list[N][ind].sep;
  185.     sep.insert(sep.begin(),-1);
  186.     sep.push_back(list[N][ind].str.length() - 1);
  187.     for(int i=0;i<sep.size() - 1;i++){
  188.         int ln = sep[i+1]-sep[i];
  189.         parts.push_back(list[N][ind].str.substr(sep[i]+1,ln));
  190.     }
  191.     mult(N,parts,"","",1,-1);
  192.     cout<<"d["<<list[N][ind].str<<"]="<<result<<endl;
  193.     cout<<"Enter ctrl + C to exit"<<endl;
  194.     while(1);
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement