这道题别看题面这么长,其实题意很简单

就是让你求从起点开始的最长合法区间

合法的要求有两个:兜圈子和直飞

且这两个条件相互独立

(也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响)

举个例子:

1 2 3 2 1 5 4 3 8 9

这个序列他的合法长度是8

因为直飞是 5 4 3 8 9

1是兜圈子的末尾,对直飞无影响

这样看来,兜圈子比直飞优秀的多

因为如果直飞的某段属于兜圈子

那么把这一段归于兜圈子后对序列的合法性无影响

但如果兜圈子的某段属于直飞,那归于直飞后

剩下的这部分可能就不是兜圈子了

所以我们先用manacher跑出回文区间

用差分数组维护一下回文区间

如果在回文区间内,则不考虑

否则判断是否直飞即可

只要确保完全符合,就记下来这个区间和这个区间的末尾值

后面的就是贪心了

最优情况自然是你选的那条正好是飞船所在

飞船所在正好是最短的

最坏情况是你最后一次选到的是最短的

且这个位置是飞船所在

几率我们会惊讶的发现其实是一样的

排个序第二个也很好求

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
#define mod 19260817
using namespace std;
char s[],cp[];
int p[],cd,t,n,ans,cnt,jl[],cf[],lnt;
char zcq1[];
int zcq2[],m;
void ycl()
{
int k=;
cp[k]=;
k++;
for(rii=;i<=cd-;i++)
{
cp[k]='#';
k++;
cp[k]=s[i];
k++;
}
cp[k]='#';
k++;
cd=k;
}
void manacher()
{
ycl();
int mx=;
int last=;
for(rii=;i<=cd-;i++)
{
if(mx>i)
{
p[i]=min(p[*last-i],mx-i);
}
else
{
p[i]=;
}
while(cp[i+p[i]]==cp[i-p[i]])
{
p[i]++;
}
if(p[i]+i>mx)
{
mx=p[i]+i;
last=i;
}
}
}
void cfs()
{
for(rii=;i<=cnt;i++)
{
if(zcq2[i]>)
{
cf[i-(zcq2[i])/]++;
cf[i+(zcq2[i])/]--;
}
}
}
int yz()
{
int sl=,pre=,pd=;
for(rii=;i<=cnt;i++)
{
sl+=cf[i];
if(sl==&&cf[i]>=)
{
if(pre==)
{
pre=zcq1[i];
continue;
}
if(pd==)
{
if(zcq1[i]>pre)
{
pd=;
}
else
{
if(zcq1[i]==pre)
{
pd=;
}
else
{
pd=;
}
}
pre=zcq1[i];
continue;
}
if(pd==)
{
if(pre>zcq1[i])
{
return i;
}
else
{
pre=zcq1[i];
}
}
if(pd==)
{
if(pre<zcq1[i])
{
return i;
}
else
{
pre=zcq1[i];
}
}
}
else
{
pre=;
}
}
return cnt+;
}
long long pw(long long ds,int ms)
{
long long res=;
while(ms!=)
{
if(ms%==)
{
ms--;
res*=ds;
res%=mod;
}
else
{
ds*=ds;
ds%=mod;
ms/=;
}
}
return res;
}
bool cmp(int kl,int lk)
{
return kl<lk;
}
void sr()
{
memset(s,,sizeof(s));
memset(p,,sizeof(p));
memset(cf,,sizeof(cf));
for(rij=;j<t;j++)
{
s[j]=getchar();
}
getchar();
getchar();
}
void fz()
{
for(rij=;j<=cd-;j+=)
{
cnt++;
zcq1[cnt]=cp[j];
zcq2[cnt]=p[j]-;
}
}
int main()
{
scanf("%d %d",&n,&t);
scanf("%d ",&m);
for(rii=;i<=n;i++)
{
sr();
cd=t;
manacher();
cnt=;
fz();
cfs();
int bnt=cnt;
int ltt=yz();
if(ltt==m+)
{
lnt++;
jl[lnt]=pw(zcq1[bnt],zcq1[bnt]);
}
// printf("%d\n",ans-1);
}
if(lnt==)
{
cout<<"-1";
return ;
}
if(lnt==)
{
cout<<jl[]<<" "<<jl[]<<" 1.00000000 1.00000000";
return ;
}
sort(jl+,jl+lnt+,cmp);
int minx=jl[];
// jl[1];
int ant=;
long long js=;
for(rii=;i<=lnt;i++)
{
if(jl[i]==minx)
{
ant++;
}
else
{
break;
}
}
for(rii=;i<=lnt;i++)
{
js+=jl[i];
}
js*=;
js+=minx;
cout<<minx<<" "<<js<<" ";
double kn=((1.0)*ant)/lnt;
kn/=lnt;
printf("%.8lf %.8lf",kn,kn);
}

ETO的公开赛T5《猎杀蓝色空间号》题解的更多相关文章

  1. ETO的公开赛T3《寻星》 题解(BY 超級·考場WA怪 )

    题解 寻星 题意:给定一个有向带权图,定义从一点到另一点的某条路径长为路径上所有边权的最大值,并给定四个点编号w,t1,t2,t3. 求出一个点s,使它在到t1,t2,t3三点最短路径最大值最大或者根 ...

  2. ETO的公开赛T2《宏聚变》 题解(BY 萌萌哒123456 )

    我们注意到这道题中最多有 $(n+q)$ 个数被加入,而每个数最多被删除一次,因此每次操作 $O(logn)$的复杂度是可以接受的. 我们对于$1..100000$之间每个数分别开一个set,维护这个 ...

  3. ETO的公开赛T1《矿脉开采》题解(正解)(by Zenurik)

    作为T1,当然是越水越好啦qwq 显然经目测可得,那个所谓的质量评级根本就没卵用,可以直接\(W_i = W_i^{V_i}\)累积到利润里面. 这样,本问题显然是一个"子集和"问 ...

  4. ETO的公开赛T4《对抗水滴》 题解(BY 萌萌哒123456 )

    题意: 给你一个\(n*n\)的矩阵A,其中有\(T\)个元素不为零.定义矩阵内元素\((x,y)\)的能量值 \(E[x][y]=\sum_{i=1}^{x}\sum_{j=1}^{y}[A[i][ ...

  5. ETO的公开赛T1《矿脉开采》题解(另类版)

    这道题别看是签到题,写起来一点不简单 出题人的正解是双向搜索 我们把物品分成两半 每一半分别跑搜索 答案存下来,用个双指针合并即可 然后我构造了两组数据卡掉了他,不得不缩小数据范围 但我这里为什么要致 ...

  6. 洛谷P1420 最长连号 题解

    题目传送门 这道题我是打暴力的...(尴尬) 所以直接是O(N2)的时间,但好像没有炸,数据很水... #include<bits/stdc++.h> using namespace st ...

  7. AI将带我们走向何方?

    AI即人工智能,对科幻着迷的博主对此认知颇深,打算从科幻电影入手,先讲下未来的AI将给人类带来哪些变化,哪些思考. 从最初的<星际航行>中的各种星球.地形等的介绍,到各个鉴于的探索,以及其 ...

  8. SDUT 3929

    Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E&quo ...

  9. 魔戒(思维+bfs)

    Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E&quo ...

随机推荐

  1. 2017年9月22日 关于JS数组

    JS数组 JS数组的定义方法 var arr = []; var arr = new Array() JS数组属性 长度 arr.length 遍历数组 索引值:从0开始数 第一种方法 for(var ...

  2. Spring Data JPA简单使用

    用Spring Data JPA操作数据库 这份教程教你用Spring Data JPA从关系数据库mysql中存储和提取数据.总结来自https://spring.io/guides/gs/acce ...

  3. js正则验证表达式

    //上传文件大小验证 $.fn.checkFileTypeAndSize = function (options) { //默认设置 var defaults = { allowedExtension ...

  4. 前端之CSS——属性和定位

    一.字体属性 1.font-size(字体大小) p { font-size: 14px; } font-size 属性可设置字体的尺寸. px:像素,稳定和精确 %:把 font-size 设置为基 ...

  5. Java中去除字符串中空格的方法

    昨天写了一个关于Excel文件处理的脚本,在字符串匹配功能上总是出现多余不正确的匹配,debug调试之后,发现一个坑. ------->代码中字符串使用了replaceAll()方法,去除了所有 ...

  6. 转:一个优秀windows C++程序员的知识体系

    转自:http://www.cppblog.com/weiym/archive/2012/06/10/178287.html.根据自身的经历,觉得作者总结的很好. 思考一个优秀windows C++ ...

  7. solidity语言9

    输入参数 pragma solidity ^0.4.16; contract Simple { function taker(uint _a, uint _b) public pure { // do ...

  8. Flask入门之模板导入与块宏(六)

    1 模板包含include 主体结构(导入整个模板,直接渲染不可修改) {% include('模板名称') %} {% include('目录/模板名称') %} 功能: 其功能就是将另一个模板加载 ...

  9. Linux --远程访问控制

    1.SSH服务端 修改配置文件 vi /etc/ssh/sshd_config 监听选项 port 22 //监听端口地址 ListenAddress 192.168.1.50 //监听地址为本机地址 ...

  10. 元素float以后,div高度无法自适应解决方案

    首先要明白 >> 浮动的子元素会脱离文档流,不再占据父元素的空间,父元素也就没有了高度. 解决方案:1 给父元素加上overflow:hidden;属性就行了. 第一种:(给父级加over ...