A. Emotional Flutter

直接将所有黑块平移到 \([1-k,0]\) 的区间即可,然后找有没有没被覆盖过的整点

注意特判 \(1-k\) 以及 \(0\) 的可行性,考场这里写挂成 \(10\) 分


B. Medium Counting

设 \(f[i][j][pos][c]\) 表示第 \(i\) 个到第 \(j\) 个字符串考虑从 \(pos\) 开始的后缀,且第 \(pos\) 位至少填 \(c\) 的方案数

\(f[i][j][pos][c]+=f[i][j][pos][c+1]\)

\(f[i][j][pos][c]+=f[i][k][pos+1][0] * f[k+1][j][pos][c+1]\)

代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=55;
char c[maxn][maxn];
int a[maxn][maxn],len,n,f[maxn][maxn][maxn][30];
const int mod=990804011;
int dfs(int l,int r,int pos,int c){
if(l>r)return 1;
if(pos==len+1)return l==r;
if(c>26)return 0;
if(~f[l][r][pos][c])return f[l][r][pos][c];
int ans=0;
ans+=dfs(l,r,pos,c+1);
for(int i=l;i<=r;i++){
// if(!(a[i][pos]==c||(a[i][pos]==27&&c)))break;
if(a[i][pos]!=c&&!(a[i][pos]==27&&c))break;
ans+=dfs(l,i,pos+1,0)*dfs(i+1,r,pos,c+1)%mod;
ans%=mod;
}
f[l][r][pos][c]=ans;
return ans;
}
signed main(){
memset(f,-1,sizeof f);
cin>>n;
for(int i=1;i<=n;i++){
scanf("%s",c[i]+1);
int l=strlen(c[i]+1);
len=max(len,l);
for(int j=1;j<=l;j++){
if(c[i][j]!='?')a[i][j]=c[i][j]-'a'+1;
else a[i][j]=27;
}
}
cout<<dfs(1,n,1,0);
return 0;
}

C. Huge Counting

由于只有 \(f(1,1,……,1)\) 有贡献,所以相当于是每个点的值是走到这个点的方案数

是多重集排列:

\[\frac{(\sum x_i)!}{\prod x_i!}
\]

然而答案只问奇偶,所以只要统计分子分母 \(2\) 的因子数是否相等即可

转化成下面的式子:

\[\sum_{w=2^i} (\frac{\sum x_i}{w}-\sum \frac{x_i}{w})
\]

发现 \(x\) 每一位如果有进位一定在相减时产生差值

所以约束条件就是所有 \(x\) 每一位最多一个为 \(1\),数位 \(dp\) 即可

数位 \(dp\) 的结果是形如小于等于 \(lim_i\) 的方案数,发现还有下边界,容斥即可

代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=990804011;
const int up=50;
const int maxn=105,maxm=1005;
int f[maxn][maxm],ans,n,l[maxn],r[maxn],all,lim[maxn],t;
bool flag;
int dp(){
memset(f,0,sizeof f);
all=(1<<n)-1;
f[up][all]=1;
// if(!flag){
// for(int i=1;i<=n;i++)cout<<lim[i]<<" ";
// cout<<endl<<endl;
// }
for(int i=up;i>=1;i--){
for(int S=0;S<=all;S++){
if(f[i][S]){
// if(!flag)cout<<i<<" "<<S<<" "<<f[i][S]<<endl;
int T=0;
// for(int j=0;j<n;j++){
// if(S>>j&1 && !(limit[j+1]>>i-1&1))
// } for(int j=1;j<=n;j++){
if( ((1<<(j-1))&S) && (!((1ll<<(i-1))&lim[j])) ){
T|=(1<<(j-1));
}
}
f[i-1][T]=(f[i-1][T]+f[i][S])%mod;
// if(!flag)cout<<"ppp "<<T<<endl;
for(int j=1;j<=n;j++){
if( (1<<(j-1))&S && (1ll<<(i-1))&lim[j] || (!((1<<(j-1))&S)) ){
//int TT=T&((-1)^1<<(j-1)) | (((1<<(j-1))&S && (1ll<<(i-1))&lim[j])?1<<(j-1):0);
int TT;
if((1<<(j-1))&S)TT=T|(1<<(j-1));
else TT=T&((-1)^1<<(j-1));
f[i-1][TT]=(f[i-1][TT]+f[i][S])%mod;
}
}
}
}
}
flag=true;
int res=0;
for(int i=0;i<=all;i++)res=(res+f[0][i])%mod;
return res;
}
void rc(int pos,int op){
if(pos==n+1){
// cout<<"hhh "<<dp()<<endl;
ans=(ans+dp()*op+mod)%mod;
return ;
}
lim[pos]=r[pos];
rc(pos+1,op);
if(l[pos]>=1){
lim[pos]=l[pos]-1;
rc(pos+1,-op);
}
return ;
}
signed main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>l[i]>>r[i];
l[i]--;
r[i]--;
}
ans=0;
rc(1,1);
cout<<ans<<endl;
}
return 0;
}

D. 字符消除2

容易发现可行循环长度是 \(kmp\) 一直取 \(nxt\) 的结果

那么构造 \(01\) 串的时候,如果 \(nxt[nxt[i]] * 2>nxt[i]\),直接把不重复的后缀复制过去即可

否则整个复制后中间还有空隙,按照贪心的思想全填 \(0\) 最优,但是可能会出现更多的循环节,那么暴力 \(kmp\) 这一区间的 \(01\) 串,如果有不满足的位置,把中间部分最后一个 \(0\) 改成 \(1\),这样一定破坏了原来多出来的匹配部分而满足条件

代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
char a[maxn];
int nxt[maxn],nxt1[maxn],t,n,cnt,p[maxn];
bool ans[maxn];
void kmp(){
memset(nxt,0,sizeof nxt);
for(int i=2,j=0;i<=n;i++){
while(j&&a[i]!=a[j+1])j=nxt[j];
if(a[i]==a[j+1])j++;
nxt[i]=j;
}
cnt=0;
p[++cnt]=n;
int x=nxt[n];
while(x){
p[++cnt]=x;
x=nxt[x];
}
return ;
}
void kmp1(int n){
memset(nxt1,0,sizeof nxt1);
for(int i=2,j=0;i<=n;i++){
while(j&&ans[i]!=ans[j+1])j=nxt1[j];
if(ans[i]==ans[j+1])j++;
nxt1[i]=j;
}
return ;
}
int main(){
cin>>t;
while(t--){
memset(ans,0,sizeof ans);
scanf("%s",a+1);
n=strlen(a+1);
kmp();
reverse(p+1,p+cnt+1);
// for(int i=1;i<=cnt;i++)cout<<p[i]<<" ";
// cout<<endl;
if(p[1]>1)ans[p[1]]=1;
for(int i=2;i<=cnt;i++){
if(p[i-1]*2>=p[i]){
int len=p[i]-p[i-1];
for(int j=p[i];j>=p[i-1]+1;j--)ans[j]=ans[j-len];
}
else{
int len=p[i]-p[i-1];
for(int j=p[i];j>=p[i]-p[i-1]+1;j--)ans[j]=ans[j-len];
kmp1(p[i]);
// for(int j=1;j<=n;j++)cout<<ans[j];
// cout<<endl;
for(int j=1;j<=i;j++){
// cout<<nxt1[j]<<" ";
if(nxt1[p[j]]!=nxt[p[j]]){
ans[p[i]-p[i-1]]=1;
break;
}
}
// cout<<endl;
}
}
for(int i=1;i<=n;i++)cout<<ans[i];
cout<<endl;
}
return 0;
}

noip模拟44的更多相关文章

  1. noip模拟44[我想我以后会碰见计数题就溜走的]

    noip模拟44 solutions 这一场抱零的也忒多了,我也只有45pts 据说好像是把几套题里面最难的收拾出来让我们考得 好惨烈啊,这次的考试我只有第一题骗了40pts,其他都抱零了 T1 Em ...

  2. Noip模拟44 2021.8.19

    比较惊人的排行榜 更不用说爆零的人数了,为什么联赛会这么难!!害怕了 还要再努力鸭 T1 Emotional Flutter 考场上没切掉的神仙题 考率如何贪心,我们把黑色的条延长$s$,白色的缩短$ ...

  3. 2021.8.19考试总结[NOIP模拟44]

    T1 emotional flutter 把脚长合到黑条中. 每个黑条可以映射到统一区间,实际操作就是左右端点取模.长度大于$k$时显然不合法. 然后检查一遍区间内有没有不被黑条覆盖的点即可. 区间端 ...

  4. [考试总结]noip模拟44

    这个真的是一个 \(nb\) 题. 考试快要结束的时候,在机房中只能听到此起彼伏的撕吼. 啊---------- 然后人们预测这自己的得分. \(\color{red}{\huge{0}}\) \(\ ...

  5. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  6. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

  7. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  8. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  9. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

随机推荐

  1. 15 道超经典大厂 Java 面试题!重中之重

    从超高频的后端面试题出发,指明学习方向 大家好,我是鱼皮. 还记得我的老弟小阿巴么?他目前正值大一暑假,在家自学编程(刷短视频)中. 他整个大一期间基本都在学习前端.后来,我带他写了一次后端,结果就崩 ...

  2. 在阿里云上单机部署k8s1.18

    系统:CentOS Linux release 8.1.1911 配置主机名 [root@iZwz9e3t4tj14jzewdtvj8Z ~]# hostnamectl set-hostname la ...

  3. 根据JavaScript中原生的XMLHttpRequest实现jQuery的Ajax

    基本介绍 XmlHttpRequest XmlHttpRequest是JavaScript中原生的,历史悠久的一种发送网络请求的方案. 基本上所有前端框架对于网络请求的部分都是基于它来完成的. 在本章 ...

  4. API文档生成(c# dll)

    一.Sandcastle 这个是c#类库方法根据注释生成帮助文档的工具,我们经常会遇到把DLL或者API提供给别人调用的情况,通过在方法中添加注释,然后再用Sandcastle 来自动生成文档给调用者 ...

  5. 老杜告诉你java小白到大神是怎么炼成的(转载)

    老杜告诉你java小白到大神是怎么炼成的 1. 学习前的准备 一个好的学习方法(应该怎么学习更高效): 一个合格的程序员应该具备两个能力 有一个很好的指法速度(敲代码快) 有一个很好的编程思想(编程思 ...

  6. elsa-core—2.Hello World: HTTP

    在本快速入门中,我们将了解一个执行工作流的最小 ASP.NET Core 应用程序.工作流将侦听传入的 HTTP 请求并写回一个简单的响应. 我们将: 创建 ASP.NET Core 应用程序. 使用 ...

  7. setsockopt中参数之SO_REUSEADDR的意义

    1.setsockopt中参数之SO_REUSEADDR的意义 1.一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用. SO_REUSE ...

  8. 命令执行 安鸾 Writeup

    目录 命令执行 01 命令执行 02 仅代码层面来说,任意命令执行漏洞的利用条件: 1.代码中存在调用系统命令的函数 2.函数中存在我们可控的点 3.可控点没有过滤,或过滤不严格. Linux命令连接 ...

  9. CentOS8 安装MySQL5.7

    CentOS_8 安装MySQL5.7 1.在安装之前,如果你的系统曾经安装过Mariadb,请先卸载:yum remove mariadb*2.安装依赖 yum install -y epel-re ...

  10. flutter中修改键盘状态

    当用户进行表格输入时,为更方便的方便用户操作,我们需要设置键盘状态方便用户点击,如当表格填写完成时,用户可以直接点击键盘下面的"完成"状态完成提交. 实现如下: TextFormF ...