Cod sursa(job #1276492)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 26 noiembrie 2014 14:58:42
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <cstring>
#include <vector>

#define N 2000002
#define mod1 9999901
#define mod2 9999907
#define p 173

char substr[N];
char str[N];


int main ()
{
    FILE *fin=fopen("strmatch.in","r");
    FILE *fout=fopen("strmatch.out","w");

    fscanf(fin, "%s %s", substr, str);
    int len_substr = strlen(substr);
    int len_str = strlen(str);
    int p_k1=1, p_k2=1; 

    for(int i=0; i<len_substr; i++)
    {
        p_k1 = (p*p_k1) % mod1;
        p_k2 = (p*p_k2) % mod2;
    }

    int substr1=0, substr2=0, str1=0, str2=0;
    for(int i=0; i<len_substr; i++)
    {
        substr1 = (substr1*p + substr[i]) % mod1;       
        substr2 = (substr2*p + substr[i]) % mod2;       
    }
    for(int i=0; i<len_substr; i++)
    {
        str1 = (str1*p + str[i]) % mod1;
        str2 = (str2*p + str[i]) % mod2;
    }
    std::vector<int> v;
    for(int i=len_substr; i<=len_str; i++)
    {
        if(str1==substr1 and str2==substr2)
        {
            v.push_back(i);
        } 
        if(i<len_str)
        {
            str1 = ((str1*p) % mod1 + str[i] - (p_k1*str[i-len_substr]) % mod1 + mod1) % mod1;
            str2 = ((str2*p) % mod2 + str[i] - (p_k2*str[i-len_substr]) % mod2 + mod2) % mod2;
        }
    }

    fprintf(fout, "%d\n", v.size());

    int i=1;
    for(auto& e: v)
    {
        fprintf(fout, "%d ", e-len_substr);
        if(++i>1000)
            break;
    }

    return 0;
}