(UVa) 10226 – Hardwood Species

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1167
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;


#define ALPHA_LIST 128

struct node{
    int cnt_trees;
    node *child[ALPHA_LIST];

    node()
    {
        cnt_trees = 0;
        loop(i, ALPHA_LIST)
        {
            child[i] = NULL;
        }
    }
}*head;

int total;


/*
void clearTree(node *p)
{
    loop(i, ALPHA_LIST)
    {
        if(p->child[i] != NULL)
        {
            clearTree(p->child[i]);
        }
    }
    delete p;
}

void init()
{
    head = new node();
}


int toint(char c)
{
    if(c== ' ')
        return 26;
    if('a' <= c && c <= 'z')
        return c - 'a';
    else
        return c - 'A';
}
*/

void insert(char *word)
{
    //cout<<"inserting " << word<<endl;
    node *current = head;

    int ch;

    while(*word != '\0')
    {
        ch = *word;

        if(current->child[ch] == NULL)
            current->child[ch] = new node();
        current = current->child[ch];
        word++;
    }
    current->cnt_trees++;
}

vector<char> name_list;

void printTree(node *current)
{
    if(current->cnt_trees)
    {
        FOR(i, 0, SZ(name_list))
        {
            pf("%c", name_list[i]);
        }
        pf(" %.4lf\n", (100.0*current->cnt_trees)/(double)total);
        //current->cnt_trees = 0;
    }

    loop(i, ALPHA_LIST)
    {
        if(current->child[i] != NULL)
        {
            name_list.pb(i);
            printTree(current->child[i]);
            name_list.pop_back();
        }
    }

    delete current;
    //current = NULL;
}


int main()
{
    int kases;
    char names[35];
    bool blank = 0;

    gi(kases);
    cin.ignore();
    cin.ignore();

    while(kases--)
    {
        if(blank) pf("\n");
        blank = 1;

        head = new node();

        //init();

        //cout<<head<<endl;

        total = 0;
        while(gets(names))
        {
            if(strlen(names) == 0) break;
            insert(names);
            total++;
        }

        printTree(head);

        //head = NULL;
        //cout<<head<<endl<<endl<<endl;

        //clearTree(head);
    }


    return 0;
}


(USACO) Healthy Holsteins

0
/*
ID: himuhas1
TASK: holstein
LANG: C++
link: http://cerberus.delos.com:790/usacoprob2?S=holstein&a=9j5vF1aY3NU
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;

#define MAXX 32772 //1<<15 + 1
#define debug

struct DATA{
    int amount[26];
} scoops[MAXX], rqr, inp[16];

int countBit(int n)
{
    if(n==0)
    {
        return 0;
    }
    return 1 + countBit(n>>1);
}


int main()
{
    #ifndef hasibpc
        freopen("holstein.in", "r", stdin);
        freopen("holstein.out", "w", stdout);
    #endif // hasibpc


    int number_of_vitamins, G;


    gi(number_of_vitamins);
    loop(i, number_of_vitamins)
    {
        gi(rqr.amount[i]);
    }

    gi(G);

    loop(i, G)
    {
        loop(j, number_of_vitamins)
        {
            gi(inp[i].amount[j]);
        }
    }

    int till = (1<<(G));

    mem(scoops[0].amount, 0);
    /*
    loop(i, G)
    {
        cout<<scoops[0].amount[i]<<"   ";
    }
    */

    int pre, best = ~(1<<29);

    bool valid;


    FOR(i, 1, till)
    {
        pre = i & ~(1<<(countBit(i)-1));
        //pf("i=%d, pre=%d\n", i, pre);
        valid = 1;
        loop(j, number_of_vitamins)
        {
            scoops[i].amount[j] = scoops[pre].amount[j] + inp[countBit(i)-1].amount[j];
            if(scoops[i].amount[j] < rqr.amount[j])
                valid = 0;
        }
        if(valid)
        {
            if(__builtin_popcount(best) > __builtin_popcount(i))
            {
                best = i;
                //cout<<"best updated"<<endl;
            }
        }
        #if 0
        else
        {
            cout<<i<<" is not valid"<<endl;
            loop(k, number_of_vitamins)
            {
                cout<<scoops[i].amount[k]<< " ";
            }
            cout<<endl;
        }
        #endif

    }


    //cout<<"came here"<<endl;
    pf("%d", __builtin_popcount(best));
    //return 00;
    //cout<< "best = " << best <<endl;

    for(int i=0; (1<<i) <= best; i++)
    {
        if(best & (1<<i))
        {
            pf(" %d", i+1);
        }
    }
    puts("");


    return 0;
}

(USACO) Sorting a Three-Valued Sequence (IOI’96 Day-2)

0

/*
ID: himuhas1
TASK: sort3
LANG: C++
link: http://cerberus.delos.com:790/usacoprob2?a=gOkLC92Plmn&S=sort3
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;

#define MAXX 1002
int cnt;
vector<int>numbers;
int cntOnes, cntTows, cntThrees;
bool used[MAXX];

int main()
{
    #ifndef hasibpc
        freopen("sort3.in", "r", stdin);
        freopen("sort3.out", "w", stdout);
    #endif // hasibpc

    cntOnes = cntTows = cntThrees = 0;

    gi(cnt);
    numbers.resize(cnt);
    loop(i, cnt)
    {
        gi(numbers[i]);
        if(numbers[i] == 1)
        {
            cntOnes++;
        }
        else if(numbers[i] == 2)
        {
            cntTows++;
        }
        else
        {
            cntThrees++;
        }
    }


    int spcnt[3][3];
    mem(spcnt, 0);
    int moveNeeded = 0;



    int till = cntOnes;
    loop(i, cntOnes)
    {
        spcnt[0][ numbers[i] - 1 ]++;
    }

    till += cntTows;
    FOR(i, cntOnes, till)
    {
        spcnt[1][numbers[i]-1 ]++;
    }

    FOR(i, till, cnt)
    {
        spcnt[2][numbers[i]-1]++;
    }



    moveNeeded +=   min(spcnt[0][1], spcnt[1][0]);
    moveNeeded +=   min(spcnt[0][2], spcnt[2][0]);
    moveNeeded +=   min(spcnt[1][2], spcnt[2][1]);



    moveNeeded = moveNeeded + ((cnt - moveNeeded*2 - spcnt[0][0] - spcnt[1][1] - spcnt[2][2])*2)/3;

    cout<<moveNeeded<<endl;


    return 0;
}


(USACO) Ordered Fractions

0

/*
ID: himuhas1
TASK: frac1
LANG: C++
link: http://cerberus.delos.com:790/usacoprob2?a=0Hi6SPQOgMg&S=frac1
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;


vector<paii>fractions;


bool comp(paii a, paii b)
{
    return a.fr*b.sc < a.sc * b.fr;
}

int gcd(int a, int b)
{
    if(a%b == 0) return b;

    return gcd(b, a%b);
}


int main()
{
    freopen("frac1.in", "r", stdin);
    freopen("frac1.out", "w", stdout);
    int n;
    paii frac;

    gi(n);

    fractions.pb(MP(0,1));

    for(int i=1; i<=n; i++)
    {
        for(int j=i; j<=n; j++)
        {
            if(gcd(i, j) > 1 ) continue;
            frac.fr = i;
            frac.sc = j;
            fractions.pb(frac);
        }
    }

    sort(all(fractions), comp);

    loop(i, SZ(fractions))
    {
        pf("%d/%d\n", fractions[i].fr, fractions[i].sc);
    }


    return 0;
}



(USACO) The Castle

1
/*
user: himuhas1
link: http://cerberus.delos.com:790/usacoprob2?a=0Hi6SPQOgMg&S=castle
*/

/*
ID: himuhas1
TASK: castle
LANG: C++
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)
#define INF 1<<29
using namespace std;

#define MAXX 52

int graph[MAXX][MAXX];
int component[MAXX][MAXX];
int column, row;
vector<int>cntElements;
bool visited[MAXX][MAXX];
char dirx[] = {-1, 0, 1, 0};
char diry[] = {0 , -1, 0, 1};

void bfs(int i, int j)
{
    paii u, v;
    u.fr = i;
    u.sc = j;
    visited[i][j] = 1;

    queue<paii>Q;
    Q.push(u);

    while(!Q.empty())
    {
        u = Q.front(); Q.pop();


        component[u.fr][u.sc] = SZ(cntElements) - 1;
        cntElements[ component[u.fr][u.sc] ]++;

        loop(i, 4)
        {
            if( ((graph[u.fr][u.sc] & (1<<i)) == 0 ))
            {
                //pf("%d & %d = %d\n", graph[u.fr][u.sc], (1<<i), 0);
                v.fr = u.fr + diry[i];
                v.sc = u.sc + dirx[i];

                if(!visited[v.fr][v.sc])
                {
                    //pf("(%d, %d) -> (%d, %d)\n", u.fr, u.sc, v.fr, v.sc);
                    visited[v.fr][v.sc] = 1;
                    Q.push(v);
                }
            }
        }
        //break;
    }

}



void setComponent()
{
    mem(visited, 0);

    loop(i, row)
    {
        loop(j, column)
        {
            if(!visited[i][j])
            {
                cntElements.pb(0);
                bfs(i, j);
            }
        }
    }


}


int main()
{
    freopen("castle.in", "r", stdin);
    freopen("castle.out", "w", stdout);
    int longestRoom;
    gi2(column, row);

    loop(i, row)
    {
        loop(j, column)
        {
            gi(graph[i][j]);
        }
    }




    setComponent();

    pf("%d\n", SZ(cntElements));

    longestRoom = -INF;
    loop(i, SZ(cntElements))
    {
        longestRoom = max(longestRoom, cntElements[i]);
    }
    pf("%d\n", longestRoom);

    longestRoom = -1;
    paii pos, v;
    char ch;
    for(int j=column-1; -1 < j; j--)
    {
        for(int i=0; i<row; i++)
        {
            for(int c=2; 0 < c; c--)
            {
                if( (graph[i][j] & (1<<c)) != 0 )
                {
                    v.fr = i + diry[c];
                    v.sc = j + dirx[c];
                    if(v.fr < 0 || v.sc >= column) continue;

                    if(component[i][j] != component[ v.fr ][ v.sc ] && longestRoom <= cntElements[ component[i][j] ] + cntElements[component[ v.fr ][ v.sc ]] )
                    {
                        longestRoom = cntElements[ component[i][j] ] + cntElements[component[ v.fr ][ v.sc ]];
                        pos.fr = i;
                        pos.sc = j;
                        ch = (c==1?'N':'E');
                    }
                }

            }
        }
    }
    cout<<longestRoom<<endl;
    cout<<pos.fr+1<<" "<<pos.sc+1<<" "<<ch<<endl;


    return 0;
}



(USACO) Checker Challenge

0
/*
user: php
link: http://cerberus.delos.com:790/usacoprob2?a=T7bTTAFb5qU&S=checker
*/

/*
ID: himuhas1
TASK: checker
LANG: C++
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;
#define MAXX 14

int N;
int cnt = 0;
int mask[MAXX][MAXX];
bool used[MAXX][MAXX];

/*
void getState()
{
    loop(i, N)
    {
        loop(j, N)
        {
            if((mask[i] & (1<<j)) != 0)
            {
                pf("1 ");
            }
            else
            {
                pf("0 ");
            }
        }
        pf("\n");
    }
}
*/


void rec(int row)
{
    if(row == N)
    {
        if(cnt < 3)
        {
            loop(i, N)
            {
                if(i) pf(" ");
                loop(j, N)
                {
                    if(used[i][j])
                    {
                        pf("%d", j+1);
                        break;
                    }
                }
            }
            pf("\n");
        }
        cnt++;
        return;
    }
    else
    {
        loop(i, N)
        {
            if( mask[row][i] == 0 )
            {

                for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
                {
                    mask[r][p]++;
                }

                for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
                {
                    mask[r][q]++;
                }

                for(int r=row+1; r<N; r++)
                {
                    mask[r][i]++;
                }

                used[row][i] = 1;


                //getState();
                //cout<<endl<<endl;

                rec(row+1);


                for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
                {
                    mask[r][p]--;
                }

                for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
                {
                    mask[r][q]--;
                }

                for(int r=row+1; r<N; r++)
                {
                    mask[r][i]--;
                }

                used[row][i] = 0;
            }
        }
    }





}

int main()
{
    freopen("checker.in", "r", stdin);
    freopen("checker.out", "w", stdout);

    mem(mask, 0);
    mem(used, 0);

    int row = 0;

    cin>>N;



    loop(i, N)
    {
            for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
            {
                mask[r][p]++;
            }

            for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
            {
                mask[r][q]++;
            }

            for(int r=row+1; r<N; r++)
            {
                mask[r][i]++;
            }

            used[row][i] = 1;


            //getState();
            //cout<<endl<<endl;

            rec(row+1);


            for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
            {
                mask[r][p]--;
            }

            for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
            {
                mask[r][q]--;
            }

            for(int r=row+1; r<N; r++)
            {
                mask[r][i]--;
            }

            used[row][i] = 0;
    }



    cout<<cnt<<endl;

    //getState();



    return 0;
}


(UVa) 571 – Jugs

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=512
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 1002

pair<int, paii>state[MAXX][MAXX];
bool visited[MAXX][MAXX];
int target;
int cA, cB;
vector<int>result;
string command[] = {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};

void bfs()
{
    mem(visited, 0);
    paii u, v;
    u.fr = u.sc = 0;
    visited[0][0] = 1;
    queue<paii>Q;
    Q.push(u);
    int quan;

    while(!Q.empty())
    {
        u = Q.front(); Q.pop();



        //change 1
        v = u;
        v.fr = cA;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 0;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;



            if(v.sc == target) break;
            Q.push(v);
        }

        //change 2
        v = u;
        v.sc = cB;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 1;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }

        //change 3
        v = u;
        v.fr = 0;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 2;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }

        //change 4
        v = u;
        v.sc = 0;
        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 3;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }

        //change 5
        v = u;
        quan = min(v.fr, cB - v.sc);
        v.fr -= quan;
        v.sc += quan;
        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 4;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }


        //change 6
        v = u;
        quan = min(v.sc, cA - v.fr);

        v.sc -= quan;
        v.fr += quan;

        if(!visited[v.fr][v.sc])
        {
            state[v.fr][v.sc].fr = 5;
            state[v.fr][v.sc].sc = u;
            visited[v.fr][v.sc] = 1;
            if(v.sc == target) break;
            Q.push(v);
        }
    }



    result.clear();

    while(v.fr + v.sc != 0)
    {
        result.pb( state[v.fr][v.sc].fr );
        v = state[v.fr][v.sc].sc;
    }
    reverse(all(result));
    loop(i, SZ(result))
    {
        cout<<command[ result[i] ]<<endl;
    }
    cout<<"success"<<endl;
}





int main()
{
    while(sf("%d %d %d", &cA, &cB, &target) == 3)
    {
        bfs();
    }
    return 0;
}



(UVa) 10246 – Asterix and Obelix

0
/*
user: php
link: uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1187
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<string>
#include<sstream>
#include<utility>

#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define getint(a) sf("%d", &a)
#define get2int(a, b) getint(a), getint(b)
#define get3int(a, b, c) getint(a), get2int(b, c)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define pi acos(-1.0)
#define INF 1<<29
#define ll long long
#define dd double
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define MP make_pair
#define pb push_back
#define fr first
#define sc second
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)
#define all(v) v.begin(), v.end()
#define mod abs

using namespace std;

#define MAXX 82

int C, R, Q;

int dist[MAXX][MAXX];
int festcost[MAXX][MAXX];

int main()
{
    //read;
    int kaseno = 0;
    int p, q, d;
    while(1)
    {
        get3int(C, R, Q);
        if(C+R+Q == 0) break;

        loop(i, C)
        {
            loop(j, C)
            {
                if(i == j) dist[i][j] = 0;
                else dist[i][j] = festcost[i][j] = INF;
            }
        }


        loop(i, C)
        {
            getint(d);
            festcost[i][i] = d;
        }


        loop(i, R)
        {
            get3int(p, q, d);
            p--; q--;
            dist[p][q] = dist[q][p] = d;
            festcost[p][q] = festcost[q][p] = max(festcost[p][p], festcost[q][q]);
        }

        loop(k, C)
        {
            loop(i, C)
            {
                loop(j, C)
                {
                    if(dist[i][j] + festcost[i][j] > dist[i][k] + dist[k][j] + max(festcost[i][k], festcost[k][j]))
                    {
                        dist[i][j] = dist[i][k] + dist[k][j];
                        festcost[i][j] = max(festcost[i][k], festcost[k][j]);
                    }
                }
            }
        }


        ///////test
        loop(k, C)
        {
            loop(i, C)
            {
                loop(j, C)
                {
                    if(dist[i][j] + festcost[i][j] > dist[i][k] + dist[k][j] + max(festcost[i][k], festcost[k][j]))
                    {
                        dist[i][j] = dist[i][k] + dist[k][j];
                        festcost[i][j] = max(festcost[i][k], festcost[k][j]);
                    }
                }
            }
        }
        ///////


        if(kaseno) pf("\n");
        pf("Case #%d\n", ++kaseno);

        loop(i, Q)
        {
            get2int(p, q);
            p--; q--;
            if(dist[p][q] + festcost[p][q] >= INF)
                puts("-1");
            else pf("%d\n", dist[p][q] + festcost[p][q]);
        }

    }
    return 0;

}


(UVa) 11463 – Commandos

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2458
*/

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>

#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<sstream>
#include<utility>
#include <cstdarg>


#define loop(i, n) for(int i=0; i<n; i++)
#define FOR(i, s, e) for(int i=s; i<e; i++)
#define getint(n) sf("%d", &n)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define SZ(a) int(a.size())
#define all(v) v.begin(), v.end()
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define dd double
#define paii pair<int, int>
#define pall pair<ll, ll>
#define MP make_pair
#define fr first
#define sc second
#define mod abs
#define pf printf
#define sf scanf
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)
#define INF 100000

using namespace std;

#define MAXX 101

int dist[MAXX][MAXX];



int cntBuildings, cntRoads;




int main()
{
    int kases, kaseno = 0;
    getint(kases);
    int p, q;
    int result;
    while(kases--)
    {
        getint(cntBuildings); getint(cntRoads);

        loop(i, cntBuildings)
        {
            loop(j, cntBuildings)
            {
                if(i == j) dist[i][j] = 0;
                else dist[i][j] = INF;
            }
        }

        while(cntRoads--)
        {
            getint(p); getint(q);
            dist[p][q] = dist[q][p] = 1;
        }

        getint(p); getint(q);

        loop(k, cntBuildings) loop(i, cntBuildings) loop(j, cntBuildings) dist[i][j] = min(dist[i][j],dist[i][k] + dist[k][j] );

        result = -1;

        loop(i, cntBuildings)
        {
            result = max(result, dist[p][i] + dist[i][q] );
        }

        pf("Case %d: %d\n", ++kaseno, result);
    }

}


(USACO) Superprime Rib

0
/*
ID: himuhas1
TASK: sprime
LANG: C++
*/



#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<utility>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define dd double
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 31625

bool isPrime[MAXX];
vector<int>primeList;
int n;

int ara[] = {1, 3, 7, 9};

void generateprime()
{
    mem(isPrime, 1);
    int root = sqrt(MAXX)+1;

    for(int i=3; i<root; i+=2)
    {
        if(!isPrime[i]) continue;
        for(int j=i*i; j<MAXX; j+=2*i)
            isPrime[j] = 0;
    }


    primeList.pb(2);
    for(int i=3; i<MAXX; i+=2)
        if(isPrime[i])
            primeList.pb(i);
    primeList.pb(INF);
}


void printprime(int num, int len)
{
    //pf("\tcalling with (%d, %d)\n", num, len);
    if(len == n)
    {
        if(num < MAXX)
        {
            if(isPrime[num])
                pf("%d\n", num);
            return;
        }

        int root = sqrt(num) + 1;
        for(int i=0; primeList[i]<root; i++)
        {
            if(num%primeList[i] == 0)
                return;
        }
        pf("%d\n", num);
        return;
    }

    int newnum;
    num *= 10;
    loop(i, 4)
    {
        newnum = num + ara[i];

        if(newnum < MAXX)
        {
            if(isPrime[newnum])
                printprime(newnum, len+1);
            continue;
        }

        bool prm = 1;
        int root = sqrt(newnum) + 1;
        for(int j=0; primeList[j] < root; j++)
        {
            if(newnum%primeList[j] == 0)
            {
                prm = 0;
                break;
            }
        }
        if(prm)
        {
            printprime(newnum, len+1);
        }
    }

}



int main()
{
    freopen("sprime.in", "r", stdin);
    freopen("sprime.out", "w", stdout);

    generateprime();


    cin>>n;

    printprime(2, 1);
    printprime(3, 1);
    printprime(5, 1);
    printprime(7, 1);

    return 0;
}