Pagini recente » Cod sursa (job #587152) | Cod sursa (job #165255) | Cod sursa (job #1634930) | Cod sursa (job #1978890) | Cod sursa (job #2624063)
#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;
}