prestige

Lab2(1)

Oct 29th, 2012
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <Windows.h>
  5. #include <map>
  6. #include <vector>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. string path, virus_mask;
  11. string path1, path2;
  12. ifstream in("replacement.txt");
  13. vector<pair<string, string> > exchange;
  14. vector<int> z_function(const string &s) {
  15.     int n = (int)s.length();
  16.     vector<int> z(n, 0);
  17.     for (int i = 1, l = 0, r = 0; i < n; i++) {
  18.         if(i <= r)
  19.             z[i] = min(z[i - l], r - i + 1);
  20.         while(z[i] + i < n && s[z[i]] == s[i + z[i]])
  21.             ++z[i];
  22.         if(i  + z[i] - 1 > r)
  23.             l = i, r = i + z[i] - 1;
  24.     }
  25.     return z;
  26. }
  27. vector<pair< pair<int, int>, pair<int, int> > > answer; // от куда до куда заменять в какой строке чем
  28.  
  29. bool comp(pair<string, string> a, pair<string, string> b) {
  30.     if(a.first.length() > b.first.length())
  31.         return true;
  32.     if(a.first.length() == b.first.length() && a.first < b.first)
  33.         return true;
  34.     return false;
  35.  
  36. }
  37.  
  38. bool isVirus(const string &s) {
  39.     vector<int> z = z_function(virus_mask + '#' + s);
  40.     int n = z.size();
  41.     for (int i = 0; i < n; i++) {
  42.         if (z[i] == virus_mask.length()) {
  43.             return z[i];
  44.         }
  45.     }
  46.     return z[n - 1] == virus_mask.length();
  47. }
  48.  
  49. int main() {
  50.     string s;
  51.     while(getline(in, s)) {
  52.         string pattern, replacement;
  53.         bool f = 0;
  54.         for (int i = 0; i < s.length(); i++) {
  55.             if(s[i] == ' ' ) {
  56.                 f = 1;
  57.                 continue;
  58.             }
  59.             if(f)
  60.                 replacement.push_back(s[i]);
  61.             else
  62.                 pattern.push_back(s[i]);
  63.         }
  64.         exchange.push_back(make_pair(pattern, replacement));
  65.     }
  66.  
  67.     sort(exchange.begin(), exchange.end(), comp);
  68.  
  69.     in.close();
  70.     in.open("text.txt", ifstream::in);
  71.     s = "";
  72.     int k = 0;
  73.     while(getline(in, s)) {
  74.         int len = s.length();
  75.         for (int i = 0; i < len; i++) {
  76.             int sz = exchange.size();
  77.             for (int j = 0; j < sz; j++) {
  78.                 virus_mask = exchange[j].first;
  79.                 int t1 = virus_mask.length();
  80.                 string str = s.substr(i, t1);
  81.                 if(isVirus(str)) {
  82.                     answer.push_back(make_pair(make_pair(i, i + t1),make_pair(k, j)));
  83.                     i += (t1 - 1);
  84.                 }
  85.             }
  86.         }
  87.         k++;
  88.     }
  89.  
  90.     in.close();
  91.     in.open("text.txt", ifstream::in);
  92.     ofstream out("result.txt");
  93.     k = 0;
  94.     int i = 0;
  95.    
  96.     while(getline(in, s)) {
  97.         int len = s.length();
  98.         for (int j = 0; j < len; j++) {
  99.             if(i < answer.size() && answer[i].second.first == k && answer[i].first.first == j) {
  100.                 j += exchange[answer[i].second.second].first.length();
  101.                 out << exchange[answer[i].second.second].second;
  102.                 i++;
  103.                 j--;
  104.             }
  105.             else
  106.                 out << s[j];
  107.         }
  108.         k++;
  109.         out << endl;
  110.     }
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment