Prince and Princess

来源:互联网 发布:vb.net 多线程 编辑:程序博客网 时间:2024/04/29 13:27
//用LIS解决其中一个串没有相同元素的LCS
 
 
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <cstring>#include <stack>#include <cctype>#include <utility>#include <map>#include <string>#include <climits> #include <set>#include <string> #include <sstream>#include <utility>#include <ctime>//#pragma comment(linker, "/STACK:1024000000,1024000000") using std::priority_queue;using std::vector;using std::swap;using std::stack;using std::sort;using std::max;using std::min;using std::pair;using std::map;using std::string;using std::cin;using std::cout;using std::set;using std::queue;using std::string;using std::istringstream;using std::getline;using std::make_pair;using std::greater; int arr[66000];int mp[66000];int table[66000];int find(int l, int r, int goal){while(l < r){int m = (l+r) >> 1;if(table[m] < goal)l = m+1;elser = m;}return l;}int main(){int T;int n_case(0);scanf("%d", &T);while(T--){int n, p, q, temp;scanf("%d%d%d", &n, &p, &q);++p;++q;memset(mp, 0, sizeof(mp[0])*(n*n+1));for(int i = 1; i <= p; ++i){scanf("%d", &temp);mp[temp] = i;}for(int i = 1; i <= q; ++i){scanf("%d", arr+i);arr[i] = mp[arr[i]];}int ans = 0;for(int i = 1; i <= q; ++i)if(arr[i]){temp = find(1, ans+1, arr[i]);ans = max(ans, temp);table[temp] = arr[i];}printf("Case %d: %d\n", ++n_case, ans);}return 0;}