(LightOj) 1126 – Building Twin Towers

0

The main idea is: dp[i][j] represent what is the maximum sum of two towers when the difference is j.


/***********Template Starts Here***********/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <functional>
#include <string>
#include <iostream>
#include <cctype>
#include <set>
#include <climits>
#include <iomanip>
#include <cassert>
//#include <unordered_map>

#define pb push_back
#define nl puts ("")
#define sp printf ( " " )
#define phl printf ( "hello\n" )
#define ff first
#define ss second
#define POPCOUNT __builtin_popcountll
#define RIGHTMOST __builtin_ctzll
#define LEFTMOST(x) (63-__builtin_clzll((x)))
#define MP make_pair
#define FOR(i,x,y) for(int i = (x) ; i <= (y) ; ++i)
#define ROF(i,x,y) for(int i = (y) ; i >= (x) ; --i)
#define CLR(x,y) memset(x,y,sizeof(x))
#define UNIQUE(V) (V).erase(unique((V).begin(),(V).end()),(V).end())
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define NUMDIGIT(x,y) (((int)(log10((x))/log10((y))))+1)
#define SQ(x) ((x)*(x))
#define ABS(x) ((x)<0?-(x):(x))
#define FABS(x) ((x)+eps<0?-(x):(x))
#define ALL(x) (x).begin(),(x).end()
#define LCM(x,y) (((x)/gcd((x),(y)))*(y))
#define SZ(x) ((int)(x).size())
#define NORM(x) if(x>=mod)x-=mod;

using namespace std;

typedef long long vlong;
typedef unsigned long long uvlong;
typedef pair < int, int > pii;
typedef pair < vlong, vlong > pll;
typedef vector<pii> vii;
typedef vector<int> vi;

const vlong inf = 2147383647;
const double pi = 2 * acos ( 0.0 );
const double eps = 1e-9;

#ifdef forthright48
     #include <ctime>
     clock_t tStart = clock();
     #define debug(args...) {dbg,args; cerr<<endl;}
     #define timeStamp printf("Execution Time: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC)
#else
    #define debug(args...)  // Just strip off all debug tokens
    #define timeStamp
#endif

struct debugger{
    template<typename T> debugger& operator , (const T& v){
        cerr<<v<<" ";
        return *this;
    }
}dbg;

//int knightDir[8][2] = { {-2,1},{-1,2},{1,2},{2,1},{2,-1},{-1,-2},{1,-2},{-2,-1} };
//int dir4[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};

inline vlong gcd ( vlong a, vlong b ) {
    a = ABS ( a ); b = ABS ( b );
    while ( b ) { a = a % b; swap ( a, b ); } return a;
}

vlong ext_gcd ( vlong A, vlong B, vlong *X, vlong *Y ){
    vlong x2, y2, x1, y1, x, y, r2, r1, q, r;
    x2 = 1; y2 = 0;
    x1 = 0; y1 = 1;
    for (r2 = A, r1 = B; r1 != 0; r2 = r1, r1 = r, x2 = x1, y2 = y1, x1 = x, y1 = y ) {
        q = r2 / r1;
        r = r2 % r1;
        x = x2 - (q * x1);
        y = y2 - (q * y1);
    }
    *X = x2; *Y = y2;
    return r2;
}

inline vlong modInv ( vlong a, vlong m ) {
    vlong x, y;
    ext_gcd( a, m, &x, &y );
    if ( x < 0 ) x += m; //modInv is never negative
    return x;
}

inline vlong power ( vlong a, vlong p ) {
    vlong res = 1, x = a;
    while ( p ) {
        if ( p & 1 ) res = ( res * x );
        x = ( x * x ); p >>= 1;
    }
    return res;
}

inline vlong bigmod ( vlong a, vlong p, vlong m ) {
    vlong res = 1 % m, x = a % m;
    while ( p ) {
        if ( p & 1 ) res = ( res * x ) % m;
        x = ( x * x ) % m; p >>= 1;
    }
    return res;
}

/***********Template Ends Here***********/

/*********** Hasib Templates Starts Here**********/

#include<bits/stdc++.h>
using namespace std;

#define loop(i, n) for(int i=0; i<(n); i++)
#define sf scanf
#define pf printf
#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, val) memset(ara, val, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define vdump(x) cerr<<#x<<" = "<<x<<endl;
#define dump(args...) cerr,args; cerr<<endl

template<typename T>
ostream& operator<<(ostream& out, vector<T> v)
{
    out<<"[ ";

    loop(i, SZ(v))
    {
        if(i) out<<", ";
        out<<v[i];
    }

    out<<" ]";
    return out;
}

template<typename T1, typename T2>
ostream& operator<<(ostream &out, pair<T1, T2> p)
{
    out<<"( "<<p.fr<<", "<<p.sc<<")";
    return out;
}

template<typename T>
ostream& operator,(ostream &out, T x)
{
    out<<x<<" ";
    return out;
}


/**********Hasib Templates Ends Here**************/

/**
 *  WARTNING for me:
 *     Never use    FOR
 *     Never use    pii, pll, vi, vi
 *     Never use    ff, ss, phl, sp, nl
 */

 #define MAXX 57
 #define MAXSUM 500007

 int ara[MAXX];
 int N;

int dp[2][MAXSUM];

int solve()
{
    mem(dp, -1);

    dp[0][0] = 0;

    int now, pre;

    now = 1, pre = 0;


    loop(i, N)
    {
        loop(j, MAXSUM)
        {
            if(dp[pre][j] != -1)
            {
                dp[now][j] = max(dp[now][j], dp[pre][j]);

                int diff = abs(j - ara[i]);

                dp[now][diff] = max(dp[now][diff], max(dp[pre][diff], dp[pre][ j ] + ara[i] ));

                //pf("dp[%d] = %d\n", diff, dp[now][diff]);

                diff = j + ara[i];

                dp[now][diff] = max(dp[now][diff], max(dp[pre][diff], dp[pre][ j ] + ara[i] ));

                //pf("dp[%d] = %d\n", diff, dp[now][diff]);

            }
        }

        swap(now, pre);
    }

    return max(dp[now][0], dp[pre][0]);




}


int main ()
{
    #ifdef hasibpc
        read("input.txt");
        //write("output.txt");
    #endif // hasibpc


    int kases, kaseno = 0;

    sf("%d", &kases);

    while(kases--)
    {
        sf("%d", &N);
        loop(i, N)
        {
            sf("%d", &ara[i]);
        }


        sort(ara, ara+N); ///optimization 😀

        int ret = solve();

        if(ret != 0)
        {
            pf("Case %d: %d\n",++kaseno, ret/2);
        }
        else
        {
            pf("Case %d: impossible\n", ++kaseno);
        }


    }



    return 0;
}


(CodeChef) MasterChef

0

A nice idea with memory optimization for Knapsack dp


// Link: http://www.codechef.com/JULY15/problems/MCHEF/


/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here


#define MAXX 100007

#define INF 16843009


int N, M;
int K;
ll ara[MAXX];

int L, R, C;

int sum[4*MAXX];

ll dp[507];


void update(int idx, int st, int ed, int i, int j, int val)
{
	if(st == i && ed == j)
	{
		sum[idx] = min(sum[idx], val);
		return;
	}


	int l = idx*2;
	int r = l + 1;
	int mid = (st + ed)/2;


	sum[l] = min(sum[l], sum[idx]);
	sum[r] = min(sum[r], sum[idx]);

	sum[idx] = INF;

	if(j <= mid)
	{
		update(l, st, mid, i, j, val);
	}
	else if(mid < i)
	{
		update(r, mid+1, ed, i, j, val);
	}
	else
	{
		update(l, st, mid, i, mid, val);
		update(r, mid+1, ed, mid+1, j, val);
	}
}



int get(int idx, int st, int ed, int pos)
{
	if(st == ed)
	{
		return sum[idx];
	}


	int l = idx*2;
	int r = l + 1;
	int mid = (st + ed)/2;

	if(sum[idx] != INF)
	{
		sum[l] = min(sum[l], sum[idx]);
		sum[r] = min(sum[r], sum[idx]);
		sum[idx] = INF;
	}


	if(pos <= mid)
	{
		return get(l, st, mid, pos);
	}
	else
	{
		return get(r, mid+1, ed, pos);
	}
}



void init()
{
	mem(sum, 1);

	mem(dp, 0);
}



int main()
{
	//init(); cout<<sum[0];
	int kases;


	take(kases);

	while(kases--)
	{
		init();
		take(N, K, M);

		ll s = 0;

		loop(i, N)
		{
			take(ara[i]);

			s += ara[i];
		}

		loop(i, M)
		{
			take(L, R, C);

			update(1, 0, N-1, L-1, R-1, C);
		}

		//cerr<<"DONE"<<endl;

		loop(i, N)
		{
			if(ara[i] < 0)
			{
				ll tmp = -ara[i];

				//dump(tmp);

				C = get(1, 0, N-1, i);

				//dump(C);

				for(int pos=K; pos>=0; pos--)
				{
					if(pos + C <= K)
					{
						dp[pos + C] = max(dp[pos + C], dp[pos] + tmp );
					}
				}
			}
		}


		cout<< s + dp[K]<<endl;
	}





}

(LightOj) 1334 – Genes in DNA

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define MAXX 50007






void calculatePrefixFunction(string &pattern, int pi[], int occur[])
{
    int m = SZ(pattern);
    pi[0] = -1;
    int k = -1;

    occur[0] = 1;

    for(int i=1; i<m; i++)
    {
        while(k > -1 && pattern[k+1] != pattern[i])
            k = pi[k];
        if(pattern[k+1] == pattern[i])
            k++;
        pi[i] = k;

        occur[i] = 1;

        if(k > -1)
            occur[i] += occur[k];
    }
}



void KMP(string &str, string &pattern, int pi[], int occur[], int dp[])
{
    int n = SZ(str);
    int m = SZ(pattern);

    int q = -1;
    loop(i, n)
    {
        while(q>-1 && pattern[q+1] != str[i])
            q = pi[q];
        if(pattern[q+1] == str[i])
            q++;
        if(q == m-1)
            q = pi[q];

        //as the problem says proper
        dp[i] = occur[q];

    }
}







ll solve()
{
    string str, pattern;
    int pi[MAXX];
    int occur[MAXX];

    string revStr, revPattern;
    int revPi[MAXX];
    int revOccur[MAXX];


    cin>>str>>pattern;

    revStr = str;
    revPattern = pattern;

    reverse(all(revStr));
    reverse(all(revPattern));

    calculatePrefixFunction(pattern, pi, occur);
    calculatePrefixFunction(revPattern, revPi, revOccur);

    int dp[2][MAXX];

    KMP(str, pattern, pi, occur, dp[0]);
    KMP(revStr, revPattern, revPi, revOccur, dp[1]);

    //dump(dp[0][9]);
    //dump(dp[1][3]);

    ll res = 0;

    for(int i=0, j=SZ(str)-2; j>-1; i++, j--)
    {
        res += (ll)dp[0][i]*(ll)dp[1][j];
        //pf("[%d] = %lld\n",i, dp[0][i]*dp[1][j]);
    }

    return res;

}




int main()
{
    //read("input");
    int kases, kaseno = 0;

    sf("%d", &kases);

    while(kases--)
    {
        pf("Case %d: %lld\n", ++kaseno, solve());
    }



    return 0;
}


(UVa) 10069 – Distinct Subsequences

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here




struct BigInteger {
    string num;

    BigInteger operator+(BigInteger other)
    {
        BigInteger ret;

        int maxLen = max( SZ(num), SZ(other.num) );

        int hate = 0;

        loop(i, maxLen)
        {
            int sum = (i<SZ(num)?num[i] : 0) + (i<SZ(other.num) ? other.num[i]:0) + hate;
            ret.num.push_back(sum%10);
            hate = sum/10;
        }
        while(hate != 0)
        {
            ret.num.push_back(hate%10);
            hate /= 10;
        }
        return ret;
    }


    void operator+=(BigInteger other)
    {
        num = (*this + other).num;
    }

};


#define MAXX 10107




string str, pattern;

BigInteger dp[MAXX][107];
bool visited[MAXX][107];



BigInteger rec(int i, int j)
{
    //dump(i);
    //dump(j);
    BigInteger &ret = dp[i][j];

    if( visited[i][j] ) return ret;

    visited[i][j] = true;

    ret.num.clear();

    if(j >= SZ(pattern))
    {
        ret.num.pb(1);
        return ret;
    }
    else if(i >= SZ(str))
    {

        ret.num.pb(0);
        return ret;
    }
    else
    {

        ret = rec(i+1, j);

        if(str[i] == pattern[j])
        {
            ret = ret+ rec(i+1, j+1);
        }

        return ret;
    }

}



void solve()
{
    mem(visited, 0);
    string res = rec(0, 0).num;
    reverse(all(res));
    loop(i, SZ(res))
    {
        res[i] = res[i] + '0';
    }

    cout<<res<<endl;

}



void init()
{

}


int main()
{
    init();

    int kases;

    take(kases);

    while(kases--)
    {
        cin>>str>>pattern;

        solve();
    }



    return 0;
}

(UVa) 164 – String Computer

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define mypair pair<int, char>
#define INF (1<<20)


#define MAXX 50

mypair dp[MAXX][MAXX];

bool visited[MAXX][MAXX];


string from, to;



//#define min something

/*
template<typename T>
T min(T a, T b)
{
    if(a.fr == b.fr)
    {
        T p, q;
        p = a;
        q = b;

        if(p.sc == 'D')
            p.sc = 0;
        else if(p.sc == 'I')
            p.sc = 1;
        else if(p.sc == 'C')
            p.sc = 2;
        else
            p.sc = 3;

        if(q.sc == 'D')
            q.sc = 0;
        else if(p.sc == 'I')
            p.sc = 1;
        else if(p.sc == 'C')
            p.sc = 2;
        else
            p.sc = 3;


        if(p <= q)
            return a;
        else
            return b;
    }

    return (a<=b)?a:b;
}
*/


int rec(int i, int j)
{


    mypair &ret = dp[i][j];

    if(visited[i][j]) return ret.fr;

    visited[i][j] = true;

    if(i>= SZ(from) && j >= SZ(to))
    {
        ret = MP(0, 'F');
        return ret.fr;
    }
    else if(i >= SZ(from))
    {
        ret = MP(SZ(to) - j, 'F');
        return ret.fr;
    }
    else if(j >= SZ(to))
    {
        ret = MP(SZ(from) - i, 'F');
        return ret.fr;
    }



    ret = MP(INF, '\0');

    ret = min(ret, MP(rec(i+1, j) + 1, 'D'));

    if(from[i] == to[j])
    {
        ret = min(ret, MP( rec(i+1, j+1), 'N' ));
    }
    else
    {
        ret = min(ret, MP(rec(i+1, j+1) + 1, 'C' ));
        ret = min(ret, MP(rec(i, j+1) + 1, 'I') );
    }

    //cerr<<"rec("<<i<<", "<<j<<") = "<<ret<<endl;


    return ret.fr;
}




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

    rec(0, 0);

    int i = 0, j = 0;

    int ch = 0;

    int cnt = 0;

    while(true)
    {
        ch = dp[i][j].sc;

        if(ch == 'F')
        {
            break;
        }
        else
        {
            if(ch == 'D')
            {
                pf("D%c%02d", from[i], i+1+cnt );
                i++;
                cnt--;
            }
            else if(ch == 'C')
            {
                pf("C%c%02d", to[j], i+1 + cnt);
                i++;
                j++;
            }
            else if(ch == 'I')
            {
                pf("I%c%02d", to[j], i + 1 + cnt);
                j++;
                cnt++;
            }
            else if(ch == 'N')
            {
                i++;
                j++;
            }
        }
    }

    while(true)
    {
        if(i>= SZ(from) && j >= SZ(to))
        {
            break;
        }
        else if(i>=SZ(from))
        {
            printf("I%c%02d", to[j], i+1+cnt);
            j++;
            cnt++;
        }
        else if(j>=SZ(to))
        {
            printf("D%c%02d", from[i], i+1+cnt);
            i++;
            cnt--;
        }
    }

    printf("E\n");



}





void init()
{
    #ifdef hasibpc
       // read("input");
       // write("output");
    #endif // hasibpc
}


int main()
{
    init();

    while(true)
    {
        cin>>from;

        if(from[0] == '#') break;

        cin>>to;

        solve();
    }


    return 0;
}


(UVa) 10990 – Another New Function

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define MAXX 2000007



int phi[MAXX];

ll depth[MAXX], comu[MAXX];


void generatePhi()
{
    loop(i, MAXX)
    {
        phi[i] = i;
    }

    for(int i=2; i<MAXX; i+=2)
    {
        phi[i] /= 2;
    }

    bool isPrime[MAXX];

    mem(isPrime, 1);

    for(int i=3; i<MAXX; i+=2)
    {
        if(isPrime[i])
        {
            for(int j=i; j<MAXX; j+=i)
            {
                phi[j] = (phi[j]/i) * (i-1);
                isPrime[j] = false;
            }
        }
    }
}

void generateDepth()
{
    for(int i=2; i<MAXX; i++)
    {
        depth[i] = depth[ phi[i] ] + 1;
    }
}


void generateComu()
{
    for(int i=1; i<MAXX; i++)
    {
        comu[i] = comu[i-1] + depth[i];
    }
}






void init()
{
    generatePhi();

    generateDepth();

    generateComu();
}


int main()
{
    init();


    int kases, n, m;

    take(kases);

    while(kases--)
    {
        take(m, n);

        pf("%lld\n", comu[n] - comu[m-1]);
    }



    return 0;
}

(UVA) 369 – Combinations

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define MAXX 107


ll nCr[MAXX][MAXX];

ll ncr(int n, int r)
{
    if(r == 0)
    {
        return 1;
    }

    if(n < r)
    {
        return 0;
    }

    ll &ret = nCr[n][r];

    if(ret != -1) return ret;

    return ret = ncr(n-1, r) + ncr(n-1, r-1);
}





void init()
{
    mem(nCr, -1);
}


int main()
{
    init();


    ll N, R;

    while(true)
    {
        sf("%lld %lld", &N, &R);
        if(N==0 && R == 0)
        {
            break;
        }
        else
        {
            pf("%lld things taken %lld at a time is %lld exactly.\n", N, R, ncr(N,R));
        }
    }



    return 0;
}


(USACO) Shopping Offers (IOI’95)

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

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define MAXX 107
#define MAX_N 7

struct DATA{
    int n;
    vector<paii>v;
    int p;
};

DATA offers[MAXX];



int s, b;

map<int, int>cart_elements;
paii cart[MAX_N];

int dp[MAX_N][MAX_N][MAX_N][MAX_N][MAX_N][MAXX];


int rec(int items[MAX_N], int pos)
{
    int &ret = dp[ items[1] ][ items[2] ][ items[3] ][ items[4] ][ items[5] ][pos];
    if(ret != -1)
    {
        return ret;
    }

    if(pos >= s)
    {
        /// applied all the offers.

        ret = 0;
        for(int i=1; i<=5; i++)
        {
            //dump(items[i]);
            ret += (items[i] * cart[i].sc);
        }
        //cout<<endl;
        return ret;
    }
    else
    {
        ret = rec(items, pos+1);

        bool can_take_this_offer = true;

        loop(i, offers[pos].n)
        {
            if( cart_elements.find(offers[pos].v[i].fr) == cart_elements.end() || offers[pos].v[i].sc > items[ cart_elements[offers[pos].v[i].fr] ] )
            {
                can_take_this_offer = false;
            }
        }

        if(can_take_this_offer)
        {
            loop(i, offers[pos].n)
            {
                items[ cart_elements[offers[pos].v[i].fr] ] -= offers[pos].v[i].sc;
            }
        }

        ret = min(ret, rec(items, pos) + offers[pos].p);
        ret = min(ret, rec(items, pos+1) + offers[pos].p);

        if(can_take_this_offer)
        {
            loop(i, offers[pos].n)
            {
                items[ cart_elements[offers[pos].v[i].fr] ] += offers[pos].v[i].sc;
            }
        }



        return ret;



    }
}



int main()
{
    #ifndef hasibpc
        read("shopping.in");
        write("shopping.out");
    #endif // hasibpc

    sf("%d", &s);

    loop(i, s)
    {
        sf("%d", &offers[i].n);

        loop(j, offers[i].n)
        {
            int c, k;

            sf("%d %d", &c, &k);

            offers[i].v.pb(MP(c, k));
        }

        sf("%d", &offers[i].p);
    }

    sf("%d", &b);

    int id, quantity, price;

    int tmp = 1;
    int items[MAX_N];
    mem(items, 0);

    loop(i, b)
    {
        sf("%d %d %d", &id, &quantity, &price);
        cart[i+1] = MP(quantity, price);
        items[tmp] = quantity;
        cart_elements[id] = tmp++;

    }


    mem(dp, -1);
    cout<<rec(items, 0)<<endl;







}

(LightOj) 1145 – Dice (I)

0
//link: http://lightoj.com/volume_showproblem.php?problem=1145

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

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


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here

#define MAXX 15002
#define MOD (100000007)

int dp[2][MAXX];
int N, K, S;

int main()
{
    int kases, kaseno = 0;

    take(kases);

    while(kases--)
    {
        take(N, K, S);
        int now = 0, previous = 1;
        mem(dp, 0);
        dp[0][0] = 1;

        loop(fao, N)
        {
            swap(now, previous);

            dp[now][0] = 0;
            for(int i=1; i<=S; i++)
            {
                dp[now][i] = (dp[now][i-1] + dp[previous][i-1] - ( i-K-1<0?0:dp[previous][i-K-1] ) ) %MOD;
                //dump(dp[now][i]);
                //testing

                //if(dp[now][i] < 0) break;



            }


        }

        pf("Case %d: %d\n", ++kaseno, (dp[now][S]+MOD)%MOD);
    }

    return 0;


}



(LightOj) 1122 – Digit Count

0

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

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


#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 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(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here

#define MAXX 11

int m, n;

vector<int>graph[MAXX];

vector<int>st;

ll dp[MAXX][MAXX];


ll rec(int toUse, int lastUsedInteger)
{
    if(toUse == n) return 1;

    ll &ret = dp[toUse][lastUsedInteger];

    if(ret != -1) return ret;

    ret = 0;
    toUse++;
    loop(i, SZ(graph[lastUsedInteger]))
    {
        ret += rec(toUse, graph[lastUsedInteger][i] );
    }

    return ret;
}



int main()
{
    int kases, kaseno=0;
    take(kases);

    while(kases--)
    {
        take(m, n);
        loop(i, MAXX) graph[i].clear();
        st.clear();
        st.resize(m);


        loop(i, m)
        {
            take(st[i]);
        }

        sort(all(st));



        {
            int mm;
            loop(i, SZ(st))
            {
                graph[ st[i] ].pb(st[i]);

                mm = min(i+3, SZ(st));

                for(int j=i+1; j<mm; j++)
                {
                    if( st[j] - st[i]  < 3 )
                    {
                        graph[ st[i] ].pb( st[j] );
                        graph[ st[j] ].pb( st[i] );
                    }
                }

            }
        }


        /*
        {//debug
            loop(i, SZ(st))
            {
                debug(graph[st[i]]);
            }

        }

        */




        mem(dp, -1);

        ll res = 0;

        loop(i, m)
        {
            res += rec(1, st[i]);
        }


        pf("Case %d: %lld\n", ++kaseno, res);





    }

    return 0;

}