Cod sursa(job #2624063)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 4 iunie 2020 14:26:30
Problema Pitici Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.37 kb
#include <bits/stdc++.h>
#define maxn 30005
#define mod 32173

std::ifstream fin ("base3.in");
std::ofstream fout ("base3.out");

int dijkstra (std::string s1, std::string s2, std::string s3){
    std::priority_queue <std::pair <int, int>, std::vector <std::pair <int, int>>, std::greater <std::pair <int, int>>> pq;

    int visited[100005] = {};

    int l1 = s1.size();
    int l2 = s2.size();
    int l3 = s3.size();
    int diff, lenght;

    for (int i=0; i<l1; i++){
        if (s1[i] == '1'){
            diff = abs(l1-2*i-1);
            if (visited[diff] == 0 or visited[diff] > l1){
                pq.push ({l1, diff});
                visited[diff] = l1;

            }
        }

    }

    for (int i=0; i<l2; i++){
        if (s2[i] == '1'){
            diff = abs(l2-2*i-1);
            if (visited[diff] == 0 or visited[diff] > l2){
                pq.push ({l2, diff});
                visited[diff] = l2;

            }
        }
    }

    for (int i=0; i<l3; i++){
        if (s3[i] == '1'){
            diff = abs(l3-2*i-1);
            if (visited[diff] == 0 or visited[diff] > l3){
                pq.push ({l3, diff});
                visited[diff] = l3;

            }
        }
    }

    int     lmax = l1;
    if (lmax < l2) lmax = l2;
    if (lmax < l3) lmax = l3;

    int new_diff, new_lenght;

    while (!pq.empty()){
        lenght = pq.top().first;
        diff = pq.top().second;
        pq.pop();

        if (lenght > visited[diff] and visited[diff] != 0)
            continue;

        new_diff = abs (diff - l1);
        new_lenght = lenght + l1;
        if (new_diff <= lmax and (visited[new_diff] == 0 or visited[new_diff] > new_lenght)){
            visited[new_diff] = new_lenght;
            pq.push({new_lenght, new_diff});
        }

        new_diff = diff + l1;
        new_lenght = lenght + l1;
        if (new_diff <= lmax and (visited[new_diff] == 0 or visited[new_diff] > new_lenght)){
            visited[new_diff] = new_lenght;
            pq.push({new_lenght, new_diff});
        }


        new_diff = abs (diff - l2);
        new_lenght = lenght + l2;
        if (new_diff <= lmax and (visited[new_diff] == 0 or visited[new_diff] > new_lenght)){
            visited[new_diff] = new_lenght;
            pq.push ({new_lenght, new_diff});
        }

        new_diff = diff + l2;
        new_lenght = lenght + l2;
        if (new_diff <= lmax and (visited[new_diff] == 0 or visited[new_diff] > new_lenght)){
            visited[new_diff] = new_lenght;
            pq.push ({new_lenght, new_diff});
        }


        new_diff = abs (diff - l3);
        new_lenght = lenght + l3;
        if (new_diff <= lmax and (visited[new_diff] == 0 or visited[new_diff] > new_lenght)){
            visited[new_diff] = new_lenght;
            pq.push ({new_lenght, new_diff});
        }

        new_diff = diff + l3;
        new_lenght = lenght + l3;
        if (new_diff <= lmax and (visited[new_diff] == 0 or visited[new_diff] > new_lenght)){
            visited[new_diff] = new_lenght;
            pq.push ({new_lenght, new_diff});
        }

    }

    return visited[0];

}

int main()
{
    std::string s1, s2, s3;
    int l1, l2, l3;
    fin >> s1 >> s2 >> s3;
    l1 = s1.size();
    l2 = s2.size();
    l3 = s3.size();

    fout << dijkstra (s1, s2, s3);

    return 0;
}