Cod sursa(job #2582063)

Utilizator MirunaStefaniaLupascu Miruna-Stefania MirunaStefania Data 16 martie 2020 12:47:19
Problema Abc2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include<fstream>
#include<cstring>
#define mod 15029
#define N 10000005
using namespace std;
ifstream fin("abc2.in");
ofstream fout("abc2.out");

char s[N];
int ct;
int n; //lg cuv din dictionar
int p3[25];


struct nod
{
    int info;
    nod *urm;
};

nod *g[mod+1];

bool gasit(int val)
{
    int lista = val % mod;
    nod *p;
    for(p = g[lista]; p; p = p->urm)
        if(p -> info == val)return 1;
    return 0;
}

void add(int x)
{
    int lista = x % mod;


    nod *p = new nod;
    p -> info = x;
    p -> urm = g[lista];
    g[lista] = p;

}

int main()
{
    char cuv[25];
    int i, val, sol=0, l;
    fin >> s;

    l=strlen(s);

    int putere=1;
    ///vectorul cu puteri
    p3[0] = 1;
    for(i = 1; i <= 20; ++i)
        p3[i] = p3[i-1]*3;


    while(fin >> cuv)
        {
            //transf in baza 3 ,putem si invers
            n=strlen(cuv);
            val = 0;
            for(i = 0; i < n; ++i)
                val += p3[i] * (cuv[i] - 'a');
            if(!gasit(val))
                add(val);
            cout << val <<" ";
        }

    /*for (i =1; i < n; ++i)
            putere *= 10;*/

    //transf primele n caractere in nr
    val = 0;
    for(i=0; i < n; ++i)
        val += (s[i]-'a') *p3[i];
    if(gasit(val))sol++;
    //cout << "\n" << val <<"\n";
    cout << sol << " ";


    for(i = n; i<l ;++i)
    {
        //eliminam caracterul i-n,adaugam caracterul i
        // toate puterile trebuie sa scada cu 3
        val /= 3; //primul e 3*2sau3*1--va disparea
        //val %= putere;//elimin prima
        val += (s[i]-'a') *p3[n-1];
        if(gasit(val))sol++;
        //cout << sol << " ";
    }
    fout << sol;






    return 0;
}