Cod sursa(job #1731964)

Utilizator BlackNestaAndrei Manaila BlackNesta Data 20 iulie 2016 15:13:45
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define P 123457
#define Q 1000003

using namespace std;

char a[2000005], b[2000005];
queue <char> q;
int n, top, cnt, sol[105], m;

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

int main()
{
    f >> a;
    n = strlen(a);
    f >> b;
    m = strlen(b);
    if(n > m) g << "0\n";
    else
    {
        cout << 1;
        int cod1, cod2, i, cod3, cod4, z1, z2;
        z1 = z2 = 1;
        cod1 = cod2 = cod3 = cod4 = 0;
        for(i = 0; i < n; i++)
            {
                cod1 = (cod1 * 10 + a[i]) % P;
                cod3 = (cod3 * 10 + a[i]) % Q;
                if (i != 0)
                    z1 = (z1 * 10) % P,
                    z2 = (z2 * 10) % Q;
            }
        for(i = 0; i < n; i++)
        {
            cod2 = (cod2 * 10 + b[i]) % P;
            cod4 = (cod4 * 10 + b[i]) % Q;
        }
        cout << cod1 << " " << cod3 << "\n\n";
        if(cod1 == cod2 && cod3 == cod4)
            cnt++, sol[++top] = 0;
        cout << cod2 << " " << cod4 << "\n";
        for(i = n; i < m; i++)
        {
            cod2 = ((cod2 - (b[i - n] * z1) % P + P) * 10 + b[i]) % P;
            cod4 = ((cod4 - (b[i - n] * z1) % Q + Q) * 10 + b[i]) % Q;
            cout << cod2 << " " << cod4 << "\n";
            if(cod1 == cod2 && cod3 == cod4)
                cnt++, sol[++top] = i - n + 1;
        }
        g << cnt << "\n";
        for(i = 1; i <= top; i++)
            g << sol[i] << " ";
        g << "\n";
    }
    f.close();
    g.close();
    return 0;
}