NOIP模拟「random·string·queen」
T1:random
我又来白剽博客了:
详细证明请看土哥
土哥写的不是很详细,我在这里详细写一下:
首先,对于f[n]的式子:
加一是那一个对的贡献,大C是选其余的几个数,\(2^{N}\)是总的子集个数。
逆序对的期望个数是:
首先,所有数字两两匹配,共有\(n*(n-1)\)对,,然后,某个对成为逆序对的的概率是50%,所以变成了四分之。
上代码:
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
#define rr register
#define inf INT_MAX
typedef long long ll;
const ll mod=998244353;
ll n;
ll read()
{
rr ll x_read=0,y_read=1;
rr char c_read=getchar();
while(c_read<'0'||c_read>'9')
{
if(c_read=='-') y_read=-1;
c_read=getchar();
}
while(c_read<='9'&&c_read>='0')
{
x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
c_read=getchar();
}
return x_read*y_read;
}
ll qpow(ll base,ll exp)
{
ll ret=1ll;
while(exp)
{
if(exp&1) ret=ret*base%mod;
base=1ll*base*base%mod;
exp>>=1;
}
return ret;
}
};
using namespace STD;
int main()
{
n=read();
ll inv=qpow(9,mod-2);
for(rr int i=1;i<=n;i++)
{
ll x=read()%mod;
cout<<(x*x%mod-1+mod)*inv%mod<<'\n';
}
}
T2:string
气死,这题我改了一整天,结果发现是二分与Hash表的指针打错了,气死。
这题的思路是Hash+Trie。
手写Hash,快的一批。
注意后缀要倒着插,前缀要正着插。
代码:
#include<bits/stdc++.h>
using namespace std;
namespace STD
{
#define rr register
#define inf INT_MAX
#define scanf ybbb=scanf
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+4;
const int LEN=2e5+4;
const ull base=131;
int m,ybbb;
int pre[N],suc[N];
char s[N]="";
ull mi[N],has[N],rehas[N];
struct node
{
node * nxt;
ull key;
int sum;
node()
{
key=sum=0;
nxt=NULL;
}
node(ull key_,int sum_)
{
key=key_,sum=sum_;
nxt=NULL;
}
};
class Hash
{
private:
node * head[LEN];
public:
void insert(ull,int);
node * find(ull);
}h[2];
void Hash::insert(ull key,int sum)
{
ull x=key%(LEN-4);
if(head[x]==NULL)
{
head[x]=new node(key,sum);
return ;
}
node * temp=head[x];
node * pre=NULL;
while(temp!=NULL&&(temp->key!=key))
{
pre=temp;
temp=temp->nxt;
}
if(temp==NULL)
{
temp=new node(key,sum);
if(pre!=NULL)
pre->nxt=temp;
return;
}
temp->sum=sum;
}
node * Hash::find(ull key)
{
ull x=key%(LEN-4);
node * temp=head[x];
while(temp!=NULL&&temp->key!=key)
temp=temp->nxt;
return temp;
}
class Trie
{
private:
int tot;
int ch[LEN][28];
int cnt[LEN];
public:
int sp;
Trie(){tot=1;}
void insert(char*,char*);
void get(int,ull);
}t[2];
void Trie::insert(char * st,char * en)
{
int p=1;
if(st>=en)
{
for(rr char * i=st;i>=en;i--)
{
int x=(*i)-'a'+1;
if(ch[p][x]==0) ch[p][x]=++tot;
p=ch[p][x];
cnt[p]++;
}
}
else
{
for(rr char * i=st;i<=en;i++)
{
int x=(*i)-'a'+1;
if(ch[p][x]==0) ch[p][x]=++tot;
p=ch[p][x];
cnt[p]++;
}
}
}
void Trie::get(int id,ull has)
{
for(rr int i=1;i<=26;i++)
{
if(ch[id][i])
{
cnt[ch[id][i]]+=cnt[id];
h[sp].insert(has*base+i,cnt[ch[id][i]]);
get(ch[id][i],has*base+i);
}
}
}
int read()
{
rr int x_read=0,y_read=1;
rr char c_read=getchar();
while(c_read<'0'||c_read>'9')
{
if(c_read=='-') y_read=-1;
c_read=getchar();
}
while(c_read<='9'&&c_read>='0')
{
x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
c_read=getchar();
}
return x_read*y_read;
}
void Pre()
{
mi[0]=1;
for(rr int i=1;i<=N-2;i++)
mi[i]=mi[i-1]*base;
}
inline ull substr(int l,int r){return has[r]-has[l-1]*mi[r-l+1];}
inline ull resubstr(int l,int r){return rehas[l]-rehas[r+1]*mi[r-l+1];}
};
using namespace STD;
int main()
{
Pre();
scanf("%s",s+1);
m=read();
for(rr int i=1;i<=m;i++)
{
char a[N]="";
scanf("%s",a+1);
int len=strlen(a+1);
t[0].insert(a+1,a+len);
t[1].insert(a+len,a+1);
}
t[0].sp=0,t[1].sp=1;
t[0].get(1,0),t[1].get(1,0);
int len=strlen(s+1);
for(rr int i=1;i<=len;i++)
has[i]=has[i-1]*base+s[i]-'a'+1;
for(rr int i=len;i>=1;i--)
rehas[i]=rehas[i+1]*base+s[i]-'a'+1;
//suc
for(rr int i=1;i<=len;i++)
{
int l=1,r=i;
while(l<r)
{
int mid=(l+r)>>1;
ull x=resubstr(mid,i);
node * temp=h[1].find(x);
if(temp==NULL) l=mid+1;
else r=mid;
}
ull x=resubstr(l,i);
node * temp=h[1].find(x);
if(temp!=NULL)
suc[i]=temp->sum;
}
//pre
for(rr int i=len;i>=1;i--)
{
int l=i,r=len;
while(l<r)
{
int mid=(l+r+1)>>1;
ull x=substr(i,mid);
node * temp=h[0].find(x);
if(temp==NULL) r=mid-1;
else l=mid;
}
ull x=substr(i,l);
node * temp=h[0].find(x);
if(temp!=NULL)
pre[i]=temp->sum;
}
ll ans=0;
for(rr int i=1;i<len;i++)
ans+=1ll*suc[i]*pre[i+1];
printf("%lld\n",ans);
}
T3:queen
emmmm。。。。官方题解已经很详细了,就不写了,但是土哥给了两个优化,还是很香的。
一个是对于\(\sum_{i=0}^{n}\)\(C^{m}_{i}\)=\(C^{m+1}_{n+1}\)的优化(证明是杨辉三角裂项)。
另一个是\(\sum_{i=1}^{n}\)\(i^{2}\)=\(n*(n+1)*(2*n+1)/6\)。
真的棒极了。
NOIP模拟「random·string·queen」的更多相关文章
- 7.27考试总结(NOIP模拟25)[random·string·queue]
死亡的尽头,没有神 T1 random 解题思路 这波是找规律完胜了.. lby dalao根据样例找出了正确的式子:\(\dfrac{n^2-1}{9}\) 然而,我这个菜鸡却推出了这样一个错误的式 ...
- NOIP 模拟 $25\; \rm string$
题解 \(by\;zj\varphi\) 考虑对于母串的每个字符,它在匹配串中有多少前缀,多少后缀. 设 \(f_i\) 表示 \(i\) 位置匹配上的前缀,\(g_i\) 为后缀,那么答案为 \(\ ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- Solution Set - 神奇 NOIP 模拟赛
\[\mathfrak{\text{Defining }\LaTeX\text{ macros...}}\newcommand{\vct}[1]{\boldsymbol{#1}}\newcommand ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
随机推荐
- Java 中节省 90% 时间的常用的工具类
前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...
- vue使用GraphVis开发无限拓展的关系图谱
1.去GraphVis官网下载对应的js,新版和旧版的js有所不同,看自己需求引入旧版还是新版(GraphVis官方网址:http://www.graphvis.cn/) visgraph.min.j ...
- HttpRunner3源码阅读:2. 模型定义
models.py 昨天体验的时候我们分别执行了httprunner -h,httprunner startproject demo, httprunner run demo,但是源码中其调用了其他文 ...
- 手把手教centos安装docker
目录 版本说明 官网安装教程 安装docker 现在网络上安装教程满天飞,很大一部分是别人的总结,可以说是成果,却没有介绍如何去实现这个成果方法.这篇就结合官网教程来聊聊如何在centos上安装doc ...
- 洛谷P2858题解
这是一道裸的第二类区间DP(由已知区间向外扩展)题. 首先定义 \(f_{i,j}\) 为最后 \(j-i+1\) 个数取 \([i,j]\) 这个区间时,\([i,j]\) 这个区间可以产生的最大价 ...
- Java面向对象01——什么是面向对象
面向过程&面向对象 面向过程思想(微观): 步骤清晰简单,第一步做什么,第二部做什么....... 面向过程适合处理一些较为简单的问题 面向对象思想(宏观): 物以类聚,分类的思维模式,思考问 ...
- 两年Android开发三面上岸腾讯,这些核心知识点建议收藏
概述 感觉毕业后时间过得真快啊,从 19 年 7 月本科毕业入职后,到现在快两年了,前段时间金三银四期间想着找一个新的工作,前前后后花了一个多月的时间复习以及面试,面试好几家大厂,最后选择了腾讯.也祝 ...
- 【Azure 应用服务】App Service For Container 配置Nginx,设置/home/site/wwwroot/目录为启动目录,并配置反向代理
问题描述 通过Docker Desktop for Linux,配置Nginx镜像后,自定义nginx.conf文件,修改启动目录和对 /out 路径的反向代理到博客园的博文地址 (https://w ...
- jvm调优命令
JDK监控和故障jps,jstat,jmap,jhat,jstack.jinfo jps ,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程. jstat ...
- 怎样在自己的 Web 中加入强大的日志系统系统?slf4j 的日志插件必须要知道!
对于程序猿来讲,一个应用程序的日志管理是极为重要的.因为,它可以帮助我们随时查看应用程序的运行状态.执行效果等信息,从而监控软件系统.或是根据日志信息解决一些重要的问题. 但是在 Java 应用程序中 ...