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

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

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

且这两个条件相互独立

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

举个例子:

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. 调试.NET程序OutOfMemoryException (转载)

    原文地址:http://blog.csdn.net/directionofear/article/details/8009427 应用程序调试,需要有个常规的调试思路,应对各类问题最基本的调试手段是什 ...

  2. HDU 1003 最大连续和

    http://www.acmerblog.com/hdu-1003-Max-Sum-1258.html 这里难点只有求起始位置,把握状态变化就行.一般这种子序列问题,都可以用dp简化 #include ...

  3. express 请求跨域后端解决方法CORS

    CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源. Origin表示本域,也就是浏览器当前页面的域.当JavaScript向外域(如sin ...

  4. shell 复制/备份文件 脚本

    #!/bin/sh # author hapday # -- echo "以时间日期为名称基准备份 war 包." date +%Y-%m-%d-%H-%M-%S cp artup ...

  5. drupal node机制理解

    [1]根据结构的功能结构的不同,drupal划分为,node,user,comment等不同的结构,他们的结构是不同的.他们可以作为四个不同的抽象类,根据这个抽象类,分别有一套hook函数去控制实现的 ...

  6. Git 基本知识与常用指令

    一.Git代码状态转换图 其中: 未被Git跟踪的状态为unstage状态: 已被Git跟踪的状态为stage状态(stage:阶段),因此包括staging状态和staged状态. untrack ...

  7. 03_CronTrigger

    [Cron表达式] Quartz使用类似于Linux下的Cron表达式定义的时间规则,Cron表达式由6到7个空格分隔的时间字段组成. [ 字符说明 ] * :可以用在所有字段中,表示对应时间域内的每 ...

  8. 【CSAPP-南大视频】Week1-计算机系统概述

    本笔记基于中国大学Mooc <计算机系统基础(一):程序的表示.转换与链接>课程,由 南京大学袁春风教授授课. 教材<深入理解计算机系统> 课程总目标:理解计算机是如何生成和运 ...

  9. scope 作用域(bean 的生存范围)

    默认是 singleton ,单例模式,如下代码: @Test public void testAddUser() throws Exception { ApplicationContext ctx ...

  10. java:工具类

    Google guava工具类的介绍和使用:https://blog.csdn.net/wwwdc1012/article/details/82228458 Apache Commons 工具类介绍及 ...