Cod sursa(job #2230189)

Utilizator kitkat007Graphy kitkat007 Data 9 august 2018 13:34:32
Problema Cel mai lung subsir comun Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <fstream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

ifstream fin("cmlsc.in");
ofstream fout("cmlsc.out");

#define IntArray vector<int>
#define MultiHashMap multimap<int, int>
#define IntPair pair<int, int>
#define IntTuple tuple<int, int, int>

class SegmentTree {
public:
	SegmentTree(int dim) {
		this->dim = dim;
		container = IntArray(4 * dim, 0);
	}

	int query(int l, int r) {
		return query(1, 1, dim, l, r);
	}

	void update(int l, int r, int val) {
		update(1, 1, dim, l, r, val);
	}

	int top() {
		return container[1];
	}

private:
	int query(int node, int a, int b, int l, int r) {
		if (a > r || b < l) return 0;
		if (a >= l && b <= r) return container[node]; 
		int mid = (a + b) / 2;
		return max(query(node * 2, a, mid, l, r), query(node * 2 + 1, mid + 1, b, l, r));
	}

	void update(int node, int a, int b, int l, int r, int val) {
		if (a > r || b < l) return;
		if (a >= l && b <= r) {
			container[node] = val;
			return;
		}
		int mid = (a + b) / 2;
		update(node * 2, a, mid, l, r, val);
		update(node * 2 + 1, mid + 1, b, l, r, val);
		container[node] = max(container[node * 2], container[node * 2 + 1]);
	}

	IntArray container;
	int dim;
};

int lcs(IntArray a, IntArray b) {
	SegmentTree sTree = SegmentTree(a.size());
	MultiHashMap hashMap = MultiHashMap();
	for (int i = 0; i < (int) a.size(); ++i) {
		hashMap.insert(IntPair(a[i], i + 1));
	}
	
	for (int i = 0; i < (int) b.size(); ++i) {
		pair<MultiHashMap::iterator, MultiHashMap::iterator> ret = hashMap.equal_range(b[i]); 
		IntArray positions;
		for (MultiHashMap::iterator it = ret.first; it != ret.second; ++it) {
			positions.push_back(it->second);
		}
		for (int i = positions.size() - 1; i >=0; --i){
			int pos = positions[i];
			int currMax = sTree.query(1, pos - 1);  
			sTree.update(pos, pos, currMax + 1);
		}
	}
	return sTree.top();
}

int main() {
	int n, m;
	fin >> n >> m;
	IntArray a(n), b(m);
	for (int i = 0; i < n; ++i) {
		fin >> a[i];
	}
	for (int i = 0; i < m; ++i) {
		fin >> b[i];
	}
	int ans = lcs(a, b);
	fout << ans << "\n";
	for (int i = 0; i < ans; ++i) {
		fout << 0 << " ";
	}
	/*fout << ans.size() << "\n";
	for (int i = 0; i < ans.size(); ++i) {
		fout << ans[i] << " ";
	}*/
    return 0;
}