Cod sursa(job #3159955)

Utilizator Robilika2007Robert Badea Robilika2007 Data 22 octombrie 2023 16:06:27
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

#define MOD1 847463
#define BASE1 73
#define MOD2 5856353
#define BASE2 93

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

string str, pattern;
vector<int>v;

int lgput(int x, int pow, int mod)
{
    if(pow == 1)
        return x;
    if(pow % 2 == 0)
        return lgput(x * x % mod, pow / 2, mod);
    return 1 + lgput(x * x % mod, pow / 2, mod);
}

struct susta
{
    int val1, val2;
    queue<char> Q;
    susta(int x1, int x2)
    {
        val1 = x1;
        val2 = x2;
    }

    void mod()
    {
        val1 %= MOD1;
        val2 %= MOD2;
    }

    void add(char a)
    {
        Q.push(a);
        val1 = val1 * BASE1 % MOD1 + a - 'A';
        val2 = val2 * BASE2 % MOD2 + a - 'A';
        mod();
    }

    void removeLast()
    {
        val1 -= Q.front() * lgput(BASE1, pattern.size(), MOD1);
        val2 -= Q.front() * lgput(BASE2, pattern.size(), MOD2);
        Q.pop();
    }

    bool operator==(susta other) const{
        return val1 == other.val1 && val2 == other.val2;
    }

};

int main()
{
    susta p(0,0), s(0,0);
    in >> pattern >> str;
    int i = 0;
    while(i < pattern.size())
    {
        p.add(pattern[i]);
        s.add(pattern[i]);
        i++;
    }
    int ans = 0;
    if(s == p)
    {
        ans = 1;
        v.push_back(1);
    }
    cout << p.val1 << " " << p.val2 << '\n';
    for(i = pattern.size() - 1; i < str.size() - pattern.size() + 1; ++i)
    {
        cout << s.val1 << " " << s.val2 << '\n';
        s.removeLast();
        if(s == p)
        {
            ans++;
            if(ans < 1000)
                v.push_back(i + 1);
        }
        s.add(str[i]);
    }
    out << ans << '\n';
    for(auto i : v)
        out << i << " ";
    return 0;
}