O(nlog(n)) LCS 白书 P66例题27 UVa10635

来源:互联网 发布:新经济政策知乎 编辑:程序博客网 时间:2024/05/22 14:55

ab两个字符串,将a字符串重新编号为 则b字符串可根据a字符串编号
例如:
a={1,7,5,4,8,3,9}
b={1,4,3,5,6,2,8,9}
a编号为{1,2,3,4,5,6,7}
b重新编号为{1,4,6,3,0,0,5,7}
(第二个编号为4是因为原来b中的4在a中位置为4)
0表示在a中没有出现过
然后用nlogn复杂度的LIS解决

#include <iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const int maxn=250*250+10;int num[maxn],s[maxn],g[maxn];int main(){    int t,C=1;    scanf("%d",&t);    while(t--) {        int n,p,q,x;        memset(num,0,sizeof num);        scanf("%d%d%d",&n,&p,&q);        for(int i = 1; i <= p+1; ++i) {            scanf("%d",&x);            num[x] = i;        }        int o=0;        for(int i = 1; i <= q+1; ++i) {            scanf("%d",&x);            if(num[x])                s[o++] = num[x];        }        for(int i = 1; i <= o; ++i) {            g[i] = 0x3f3f3f3f;        }        int ans = -1;        for(int i = 0; i < o; ++i) {            int k=lower_bound(g,g+o,s[i])-g;            g[k] = s[i];            ans=max(ans,k);        }        printf("Case %d: %d\n",C++,ans);    }    return 0;}
0 0