[20190725NOIP模拟测试8]题解
Orz
T1
大水题,考场上看到题目中什么前几位相同末尾加字母莫名慌的一批
后来发现直接无脑哈希就能$O(n)$
KMP同样可切
仔细读题,数组别开小
#include<cstdio>
#include<iostream>
#include<cstring>
#define re register
using namespace std;
typedef unsigned long long ull;
const int N=,base=;
int T,la,lb;
ull power[N],ha[N],hb[N];
char A[N],B[N],ed[];
inline void ini()
{
for(int i=;i<=la;i++)
ha[i]=hb[i]=;
}
inline void work()
{
scanf("%d%d",&la,&lb);
scanf("%s",A+);
scanf("%s",ed);
ini();
for(re int i=;i<=lb;i++)
B[i]=A[i];
B[++lb]=ed[];
for(re int i=;i<=lb;i++)
hb[i]=hb[i-]*base+B[i];
for(re int i=;i<=la;i++)
ha[i]=ha[i-]*base+A[i];
//debug();while(1);
int ans=;
for(re int i=;i<=min(la,lb);i++)
{
if(i==)
{
if(A[]==B[lb])ans=;
continue;
}
if(ha[i]==hb[lb]-hb[lb-i]*power[i])
ans=max(ans,i);
//cout<<geta(1,i)<<' '<<getb(lb-i+1,lb)<<endl;
}
printf("%d\n",ans); }
int main()
{
scanf("%d",&T);
power[]=;
for(re int i=;i<=N;i++)
power[i]=power[i-]*base;
while(T--)work();
return ;
}
T2
画画图可以发现,所谓“必经之路”就是删去后使1和n不联通的点
那么这些点一定是原图的割点,同时满足删掉后1和n不再联通
于是大概思路就出来了:跑$Tarjan$,再乱搞满足第二个条件
不难发现,要满足后者,当且仅当n在所求得割点的搜索树子树上
那么这个条件反映到$Tarjan$算法上是什么呢?
即对于割点x,存在与它相连的点y,满足$dfn[y] \leq dfn[n]$
为什么?
考虑$dfn[]$的实际含义:每个点被访问的时间戳,我们可以用它判断点被访问的先后
如果y与n位于不同子树(不成立情况):
先访问n再访问y:显然$dfn[y]>dfn[x]$,不满足
反之:$dfn[y]$已更新而$dfn[n]$未更新,也不满足
如果y与n同树:
y在n前/y即为n:成立
n在y前(不成立):显然此时$dfn[y]>dfn[n]$,不满足
命题得证。
inline void tarjan(int x)
{
low[x]=dfn[x]=++ind;
int flag=;
for(int i=head[x];i;i=nxt[i])
{
if(!dfn[to[i]])
{
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
if(low[to[i]]>=dfn[x])
{
flag++;
if((x!=||flag>)&&dfn[to[i]]<=dfn[n])iscut[x]=;
}
}
else low[x]=min(low[x],dfn[to[i]]);
}
}
还有一个问题:如果单想到要让n在割点的子树里,很容易写成dfn[x]<dfn[n]
然额实际上是不行的,会获得30分的好成绩(雾
为什么呢?
如果n位于由x出发的一条返祖路径上就完蛋了。
可以自己画图玩一下。
T3
玄学题,点我看大佬题解
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=;
const ll inf=0x7fffffffffff;
int T;
char str[N];
int s[N<<],cnt[N<<],len;
ll val[N<<];
void ini()
{
for(int i=;i<=len*;i++)
s[i]=cnt[i]=val[i]=;
}
void work()
{
ll ans=inf;
scanf("%s",str+);
len=strlen(str+);
ini();
for(int i=;i<=len;i++)
s[i]=s[i+len]=(str[i]=='B'?:);
/*for(int i=1;i<=(len<<1);i++)
cout<<s[i];*/
for(int i=;i<=(len<<);i++)
cnt[i]=cnt[i-]+s[i],val[i]=val[i-]+i*s[i];
int p=;
for(int i=;i<=len;i++)
{
ll res=inf;
for(int j=p;j<=i+len+;j++)
{
ll lnum=cnt[j-]-cnt[i-];
ll rnum=cnt[i+len-]-cnt[j-];
ll sum=(val[j-]<<)-val[i-]-lnum*i+rnum*1LL*(i+len-)-val[i+len-]-(lnum-)*lnum/-(rnum-)*rnum/;
if(sum>res)break;
res=sum,p=j;
ans=min(ans,res);
}
}
cout<<ans<<endl;
}
int main()
{
//cout<<0x7fffffffffff<<endl;while(1);
scanf("%d",&T);
while(T--)work();
return ;
}
[20190725NOIP模拟测试8]题解的更多相关文章
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- [CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...
- [CSP-S模拟测试92]题解
A.数列 显然每个数的答案是互相独立的,直接扩欧求解.我们需要最小化$ax+by=gcd(a,b)$中的$|x|+|y|$,而显然当x或y靠近0时答案可能最优,列个不等式求一下即可. 能$O(1)$千 ...
随机推荐
- PHP curl_reset函数
curl_reset— 重置libcurl会话句柄的所有选项. 说明 void curl_reset ( resource $ch ) 该函数将重新初始化cURL的所有选项值(默认值). 注意:cur ...
- layui导出表格全部数据
layui自带的导出表格,只能导出当前页面,如果当前页包含全部数据,那不就是导出全部数据了吗,所以我给导出事件单独定义了一个请求,当触发这个请求时,在后台查询数据时不要按接收的page 和 limit ...
- AcWing 207. 球形空间产生器 (高斯消元)打卡
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体. 现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. ...
- jquery给表格绑值
jquery给表格绑值 直接上代码了 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- winform中的小技巧【自用】
一.C#在WinForm中怎样让多行TEXTBOX的换行 今天做项目,有一段提示文字需要弹出来,由于太长,我就想能不能让它换行.然后就百度了一下,嘿嘿,方法很好用哦. 原文链接:https://blo ...
- The Preliminary Contest for ICPC Asia Shenyang 2019 H
H. Texas hold'em Poker 思路:根据每个牌型分等级,然后排序按照等级优先,最大值次之,次大值,最后比较剩下值的和. #include<bits/stdc++.h> us ...
- java遇到的问题
1.java 初始化泛型数组 public static <T> T[] toArray(java.util.List<T> src, Class<T> type) ...
- nutch1.9 + solr4.72
solr.server.url : URL of the SOLR instance (mandatory) solr.commit.size : buffer size when sending t ...
- spark性能调优04-算子调优
1.使用MapPartitions代替map 1.1 为什么要死使用MapPartitions代替map 普通的map,每条数据都会传入function中进行计算一次:而是用MapPartitions ...
- redis 入门之列表
lpush 将一个或多个值 value 插入到列表 key 的表头如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPU ...