Cod sursa(job #2458798)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 21 septembrie 2019 15:36:10
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<queue>
#include<algorithm>
#include<cstring>
#define pp pair<int,int>
#define inf 1000000000
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int nod,aux,a,b,dif,ok,sol,i,j,n,m,s[3],d[16001],f[16001];
char c[3][16001];
vector<pp > v[16000];
priority_queue<pp,vector<pp >,greater<pp > > q;
int main()
{
    for(i=0;i<=2;i++)
    {
        fin>>c[i];
        s[i]=strlen(c[i]);
    }
    m=16000;
    sort(s,s+3);
    for(i=0;i<=m;i++)
    {
        d[i]=inf;
        for(j=0;j<=2;j++)
            if(j==0||s[j]!=s[j-1])
            {
                a=i+s[j];
                if(a<=m) v[i].push_back(make_pair(a,s[j]));
                b=i-s[j]; if(b<0) b=-b;
                if(b!=a) v[i].push_back(make_pair(b,s[j]));
            }
    }
    d[0]=0;q.push(make_pair(0,0));
    while(!q.empty())
    {
        nod=q.top().second;
        if(f[nod]==1) continue;
        f[nod]=1;
        for(auto it:v[nod])
            if(d[it.first]<d[nod]+it.second)
            {
                d[it.first]=d[nod]+it.second;
                q.push(make_pair(d[it.first],it.first));
            }
    }
    sol=inf;
    for(i=0;i<=2;i++)
    {
        aux=strlen(c[i]);
        for(j=0;c[i][j];j++)
        {
            dif=aux-2*j-1;if(dif<0) dif=-dif;
            if(c[i][j]=='1')
                sol=min(sol,d[dif]+aux);
        }
    }
    if(sol==inf) fout<<0; else;
    fout<<sol;
    return 0;
}