题目链接

题意分析

\(olinr\) : 序列自动机+一系列的鬼畜操作

相信我 你们没人能切

\(lzxkj\) : \(2^m+vector+\)暴力二分 跑得比你正解还快

首先一看\(m≤5\) 直接\(2^m\)枚举所有的子序列

然后我们用一个\(vector\)把匹配序列中的权值相同的位置存入一个\(vector\)

匹配当前值的时候 直接二分找到刚好可以满足的位置就可以了

复杂度\(O(q* 2^m* m* log_n)\)(应该远不及上界)

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 508
#define IL inline
#define M 1008611
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int n,m,len,ans1,maxn,ans2;
int num[M],key[N],lg[N],tmp[N];
vector<int> G[M];
vector<int>::iterator it;
IL int getlen(int x)
{int res=0;for(;x;x-=x&-x) res++;return res;}
IL bool check(int x)
{
int pos=0;
for(;x;x-=x&-x)
{
int now=lg[x&-x]+1;
it=upper_bound(G[key[now]].begin(),G[key[now]].end(),pos);
if(it==G[key[now]].end()) return 0;
else pos=*it;
}
return 1;
}
IL void comp(int &x,int y)
{
int cdy=x,wzy=y;
for(;cdy&&wzy;cdy-=cdy&-cdy,wzy-=wzy&-wzy)
{
int nowx=lg[cdy&-cdy]+1,nowy=lg[wzy&-wzy]+1;
if(key[nowx]>key[nowy]) {x=y;return;}
else if(key[nowx]<key[nowy]) return;
}
}
int main()
{
// freopen("flag.in","r",stdin);
// freopen("flag.out","w",stdout);
read(n);
for(R int i=1;i<=n;++i)
{
read(num[i]);
G[num[i]].push_back(i);
maxn=max(maxn,num[i]);
}
for(R int i=0;i<=6;++i) lg[1<<i]=i;
read(m);
while(m--)
{
int len,tmp=0;ans1=0;ans2=0;read(len);
for(R int i=1;i<=len;++i) read(key[i]);
for(R int i=0;i<(1<<len);++i)
{ if(check(i))
{
int tmp=getlen(i);
if(tmp>ans1) ans1=tmp,ans2=i;
else if(ans1==tmp) ans1=tmp,comp(ans2,i);
}
}
printf("%d ",ans1);
for(R int i=1;i<=len;++i)
if((1<<(i-1))&ans2) printf("%d ",key[i]);puts("");
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

HEOI 2019 RP++

SP9098 LCS3的更多相关文章

  1. (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离

    斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...

随机推荐

  1. OGNL入门

    ------------------siwuxie095 OGNL 入门 1.OGNL 支持对象方法调用,即 objName.methodName() 如:使用 OGNL 表达式 + Struts2 ...

  2. ThinkPHP出现General error: 2006 MySQL server has gone away的解决方法

    错误: #13 {main}SQLSTATE[HY000]: General error: 2006 MySQL server has gone awayFILE: \ThinkPHP\Library ...

  3. Django基础学习四_数据库的增删改查

    今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...

  4. Golang之实现一个负载均衡算法(随机,轮询)

    代码记录 程序结构目录 --------程序包 package balance type Balancer interface { DoBalance([]*Instance, ...string) ...

  5. MySql创建多表关联的步骤

    一,一对多表的创建 1.创建主表 create table HostTable( cid varchar(32) primary key, cname varchar(100)); 2.创建从表 cr ...

  6. android Service 的简单使用(转)

    1.要使用Service,首先就是在配置文件里吗添加Service,如果不填加,你的Service是不能够使用的.目前学到的方法有两种    方法一:<service android:enabl ...

  7. C语言基础课First作业

    一.大学和高中最大的不同是没有人天天看着你,也不会担心上课的时候班主任在后门偷偷瞄着我们,通过阅读邹欣老师的博客后,心目中理想的师生关系就是Coach/Trainee(健身教练/健身学员)的关系,想到 ...

  8. Oracle学习笔记(四)

    六.约束 1.约束的作用 定义规则:什么数据可以输入,什么不可以 确保完整性:数据的精确性和可靠性 2.Oracle五个重要的约束: 非空约束.主键约束.外键约束.检查约束.唯一约束. (1)非空约束 ...

  9. HRBUST1212 乘积最大 2017-03-06 15:47 59人阅读 评论(0) 收藏

    乘积最大 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一 ...

  10. C#基础入门 十一

    C#基础入门 十一 复选框 复选框的应用--问卷调查 实现描述:通过问卷调查统计性别和下班后回家的方式,单击"提交"按钮,通过消息框显示所提交的信息.运行结果如下图所示(图27): ...