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 ...
随机推荐
- DC-6靶机
仅供个人娱乐 靶机信息 下载地址:https://download.vulnhub.com/dc/DC-6.zip 一.主机发现 nmap -sn 192.168.216.0/24 二.端口扫描 nm ...
- SpringBoot数据访问之整合Mybatis配置文件
环境搭建以及前置知识回顾 SpringBoot中有两种start的形式: 官方:spring-boot-starter-* 第三方:*-spring-boot-starter Mybatis属于第三方 ...
- testlink在win7下的安装\配置\使用
1.xampp >解压并安装xampp >在安装目录下点击setup_xampp(这一步是为了初始化一些环境的配置) >再启动xampp-control,运行Apache和MySQL ...
- Java后端编译
概述 如果我们把字节码看作是程序语言的一种中间表示形式(Intermediate Representation,IR)的话, 那编译器无论在何时.在何种状态下把Class文件转换成与本地基础设施(硬件 ...
- .Net Core with 微服务 - 分布式事务 - 2PC、3PC
最近比较忙,好久没更新了.这次我们来聊一聊分布式事务. 在微服务体系下,我们的应用被分割成多个服务,每个服务都配置一个数据库.如果我们的服务划分的不够完美,那么为了完成业务会出现非常多的跨库事务.即使 ...
- 『Java』StringBuilder类使用方法
String类存在的问题 String类的底层是一个被final修饰的byte[],不能改变. 为了解决以上问题,可以使用java.lang.StringBuilder类. StringBuilder ...
- dubbo学习实践(4)之Springboot整合Dubbo及Hystrix服务熔断降级
1. springboot整合dubbo 在provider端,添加maven引入,修改pom.xml文件 引入springboot,版本:2.3.2.RELEASE,dubbo(org.apache ...
- 使用Cobertura做代码覆盖率测试
经验总结:首先要把cobertura.jar包含ant的classpath路径中,其次要求它包含在测试用例的classpath中: 使用cobertura做代码覆盖率测试中出现的问题:覆盖率始终为0, ...
- 爬虫实践二--豆瓣top250电影
import requests def get_movies(): headers={ 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...
- MySQL-07-information_schema/show
information_schema.tables视图 DESC information_schema.TABLES /** TABLE_SCHEMA ---->库名 TABLE_NAME -- ...