Cod sursa(job #868684)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 31 ianuarie 2013 14:32:53
Problema Potrivirea sirurilor Scor 38
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 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;
int hareza=1; // numarul ala 7 la a n-1
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;
    }
    numar=(int)a.size()-1;
    while(true)
    {
        fscanf(in,"%c",&citit);
        if(citit=='\n')
            break;
        b.push_back(citit);
        if(pozitie<numar)
        {
            constant*=7;
            constant+=(int)citit;
            constant%=53;
            if(pozitie!=numar-1)
            {
            hareza*=7;
            hareza%=53;
            }
            pozitie++;
        }

    }
    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 ajutor;
        ajutor=((hareza*b[i-numar])%53);
        constant-=ajutor;
        constant+=53;
        constant%=53;
        constant*=7;
        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);
}