Cod sursa(job #867921)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 30 ianuarie 2013 13:17:27
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>
#include<string.h>
#include<vector>
#include<math.h>
using namespace std;
FILE*in=fopen("strmatch.in","r");
FILE*out=fopen("strmatch.out","w");
int constant,compare,pozitie,numar,contor_afisat;
char citit;
vector<int> a,b,contor_afisa;
int main()
{
    while(true)
    {
        fscanf(in,"%c",&citit);
        a.push_back(citit);
        if(citit=='\n')
            break;
        compare*=7;
        compare+=(int)citit;
        compare%=53;
    }
    while(true)
    {
        fscanf(in,"%c",&citit);
        if(citit=='\n')
            break;
        b.push_back(citit);

    }
    numar=(int)a.size()-1;
    for(int i=0;i<numar;++i)
    {
        constant*=7;
        constant+=(int)b[pozitie++];
        constant%=53;
    }
    for(int i=numar;i<(int)b.size();++i)
    {
        if(compare==constant)
        {
            int contor=0;
            bool print=true;
            for(int j=i-numar;j<i;j++)
            {
                if(b[j]==a[contor])
                    contor++;
                else
                    {print=false; break;}
            }
            if(print)
            {
                contor_afisat++;
                contor_afisa.push_back(i-numar);
            }
        }
        int hareza=pow(7,numar-1)*b[i-numar];
        hareza%=53;
        constant-=hareza;
        constant+=53;
        //constant%=53;
        constant*=7;
       //constant%=53;
        constant+=b[i];
        constant%=53;
    }
    fprintf(out,"%d\n",contor_afisat);
    for(int i=0;i<contor_afisa.size();++i)
        fprintf(out,"%d ",contor_afisa[i]);
    printf("%d",'Z');

fclose(in);
fclose(out);
}