Cod sursa(job #2191512)

Utilizator ibogdan25Ilie Ionut ibogdan25 Data 2 aprilie 2018 22:11:35
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
// SortChar.cpp : Defines the entry point for the console application.
//

#include <queue>
#include <string>
#include <fstream>
#define PRIME 2531
using namespace std;

ifstream f("secv5.in");
ofstream fout("secv5.out");
struct Hash{
    vector < pair<int,int> > numbers;
}H[PRIME];
int counter = 0;

int isInHash(int number) {
    int key = number % PRIME;
    for (int i = 0; i < H[key].numbers.size(); i++) {
        if (H[key].numbers[i].first == number) return 1;
    }
    return 0;
}
void addNumber(int number) {

    int key = number % PRIME;
    H[key].numbers.push_back(make_pair(number, 1));
    counter++;
}
void removeNumber(int number) {
    int key = number % PRIME;
    for (int i = 0; i < H[key].numbers.size(); i++) {
        if (H[key].numbers[i].first == number) {
            H[key].numbers.erase(H[key].numbers.begin() + i);
            break;
        }
    }
}
void update(int number, int numToAdd) {
    int key = number % PRIME;
    for (int i = 0; i < H[key].numbers.size(); i++) {
        if (H[key].numbers[i].first == number) {
            H[key].numbers[i].second += numToAdd;
            if (H[key].numbers[i].second == 0) {
                H[key].numbers.erase(H[key].numbers.begin() + i);
                counter--;
            }
            break;
        }
    }
}
int main() {
    queue <int> numbers;
    vector <int> elements;
    int n = 0, l = 0, g = 0, solution = 0, x = 0;
    f >> n >> l >> g;
    while (n--) {
        f >> x;
        elements.push_back(x);
    }
    int i = 0, j = 0;
    while (i < elements.size()) {
        x = elements[j];
        numbers.push(x);
        if (isInHash(x)) {
            update(x, 1);
        } else {
            addNumber(x);
        }
        if (counter >= l && counter <= g) {
            solution++;
        }
        if (counter > g) {
            while (!numbers.empty()){
                int valoare = numbers.front();
                numbers.pop();
                update(valoare, -1);
            }
            i++;
            j = i - 1;
        }
        j++;
        if (j == elements.size()) {
            while (!numbers.empty()){
                int valoare = numbers.front();
                numbers.pop();
                update(valoare, -1);
            }
            i++;
            j = i ;
        }
    }
    fout << solution;
    return 0;
}