Pagini recente » Cei mai harnici utilizatori info-arena | Clasamentul arhivei de probleme | Monitorul de evaluare | Cod sursa (job #2671999) | Cod sursa (job #2696315)
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <climits>
#include <algorithm>
#define INF LONG_MAX
using namespace std;
ifstream fin("teroristi.in");
ofstream fout("teroristi.out");
long n, m, S, D, c[30*30][30*30], f[30*30][30*30], frec[30*30], ind[30*30][20000];
vector<long> t, cr;
string ss;
bool BF()
{
queue<long> Q;
vector<int> s(D+1);
t.assign(D+1, 0);
cr.assign(D+1, 0);
s[S] = 1;
cr[S] = INF;
Q.push(S);
while (!Q.empty())
{
int i = Q.front();
Q.pop();
for (int j = S; j <= D; ++j)
{
if (s[j])
{
continue;
}
if (c[i][j] > f[i][j])
{
cr[j] = min(cr[i], c[i][j] - f[i][j]);
s[j] = true;
t[j] = i;
Q.push(j);
if (j == D)
{
return true;
}
}
}
}
return false;
}
int main()
{
fin >> n >> m;
fin >> ss;
for (int i = 0; i < ss.size(); ++i)
frec[ss[i]-'a'+1]++;
char ch1, ch2;
int x, y;
for (int i = 1; i <= m; ++i)
{
fin >> ch1 >> ch2;
x = ch1-'a'+ 1;
y = ch2-'a'+ 1;
if (y < x) swap(x,y);
int nod = x*26 + y;
frec[nod]++;
ind[nod][frec[nod]] = i;
c[x][nod] = INF;
c[y][nod] = INF;
}
S = 0; D = 703;
for (int i = 1; i <= 26; ++i)
c[S][i] = frec[i];
for (int i = 27; i <= 702; ++i)
c[i][D] = frec[i];
while (BF())
{
int ii, jj;
jj = D;
while (jj != S)
{
ii = t[jj];
f[ii][jj] += cr[D];
f[jj][ii] -= cr[D];
jj = ii;
}
}
for (int i = 0; i < ss.size(); ++i)
{
int poz = ss[i] - 'a' + 1;
for (int j = 27; j <= 702; ++j)
if (f[poz][j])
{
fout << ind[j][frec[j]] << ' ';
frec[j]--;
f[poz][j]--;
break;
}
}
return 0;
}