Cod sursa(job #2536034)

Utilizator TheRealInfiniteConstantin Alexandru TheRealInfinite Data 1 februarie 2020 13:59:40
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <string>
#include <algorithm>
#include <string>

using namespace std;

int n, m;
int mod1, mod2;
string A, B;

vector<int> v;

ifstream f("strmatch.in");
ofstream g("strmatch.out");

int nr;

void RabinKarp()
{
  int amod1=0, amod2=0;
  int bmod1=0, bmod2=0;

  for(int i = 0; i < m; i++)
  {
    bmod1 = (bmod1 * 27 + (B[i]-'a'+1)) % mod1;
    bmod2 = (bmod2 * 27 + (B[i]-'a'+1)) % mod2;
  }

  for(int i = 0; i < m; i++)
  {
    amod1 = (amod1 * 27 + (A[i]-'a'+1)) % mod1;
    amod2 = (amod2 * 27 + (A[i]-'a'+1)) % mod2;
  }

  if(amod1 == bmod1 && amod2 == bmod2)
  {
    nr++;
    v.push_back(0);
  }

  int p1=1;

  for(int i = 1; i < m; i++)
    p1 = (p1 * 27) % mod1;

  int p2=1;

  for(int i = 1; i < m; i++)
    p2 = (p2 * 27) % mod2;

  for(int i = m; i < n; i++)
  {
    amod1 = (((amod1 - p1 * (A[i - m]-'a'+1)) * 27 + (A[i]-'a'+1)) % mod1 + mod1) % mod1;
    amod2 = (((amod2 - p2 * (A[i - m]-'a'+1)) * 27 + (A[i]-'a'+1)) % mod2 + mod2) % mod2;
    if(amod1 == bmod1 && amod2 == bmod2)
    {
        nr++;
        v.push_back(i);
        if(nr == 1000)
            break;
    }
  }
}

int main()
{
  f>>B;
  f>>A;
  n = A.size();
  m = B.size();

  mod1 = 666013;
  mod2 = 666013;

  RabinKarp();

  g<<nr<<endl;
  for(int i = 0; i < nr; i++)
      g<<(v[i] - m + 1)<<" ";

}