SP9098 LCS3
题目链接
题意分析
\(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的更多相关文章
- (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离
斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...
随机推荐
- Django基础学习三_路由系统
今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...
- 最小子串覆盖 · Minimum Window Substring
[抄题]: 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要. ...
- SNAT和DNAT的区别
SNAT: Source Network Address Translation,是修改网络包源ip地址的.DNAT: Destination Network Address Translation, ...
- Rabbitmq的几种交换机模式
Rabbitmq的核心概念(如下图所示):有虚拟主机.交换机.队列.绑定: 交换机可以理解成具有路由表的路由程序,仅此而已.每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字 ...
- Shared Libraries with Eclipse on 86_64 (64 bits) systems[z]
If you followed my previous post http://linuxtortures.blogspot.com/2012/02/shared-libraries-with-ecl ...
- 训练超参数, 出现 Cannot use GPU in CPU-only Caffe 错误?
当我们用MNIST手写体数字数据库和LeNet CNN 模型训练超参数,运行 examples/mnist/train_lenet.sh是出现Cannot use GPU in CPU-only Ca ...
- 拒绝枯燥,有意思的 Loading 页面动效设计
互联网时代,网络“提速”日益频繁,人们打开Web或软件的速度越来越快,一般页面缓冲和加载地过程也是几不可查.然而,在某些情况下,例如软件急需加载大量页面,首页急需加载大量内容,用户下载文件过大,甚至是 ...
- Workflow笔记2——状态机工作流(转)
出处:http://www.cnblogs.com/jiekzou/p/6192813.html 在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它 ...
- PHP(二)变量和常量
- MFC中的一般经验之谈----OnInitialUpdate
在MFC程序设计中,按照传统的设计,如果处理WM_PAINT消息,一般会派生一个OnPaint函数,映射到WM_PAINT消息上进行绘图处理.但是很多程序中并没有出现OnPaint,一个OnDraw函 ...