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. Typhoon靶机

    仅供个人娱乐 靶机信息 靶机下载地址:https://www.vulnhub.com/entry/typhoon-102,267/ 一.主机探测 arp-scan -l nmap -sV -p- -A ...

  2. 如何开启MySQL远程连接

    MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问,这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架构来说 ...

  3. 洛谷P3052题解

    题面 看起来非常简单,但是细节多的一批的状压DP入门题. 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间. 对于每一个 \(i\) , ...

  4. 2020年最新阿里、字节、腾讯、京东等一线大厂高频面试(Android岗)真题合集,面试轻松无压力

    本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Android面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行发展的标杆,很多公司的面试官同样会研 ...

  5. Centos配置网络和主机映射

    目录 虚拟机网络的三种配置方式 配置虚拟机IP 主机映射问题 配置虚拟机的主机名 虚拟机远程登录 虚拟机网络的三种配置方式 桥接模式:当前虚拟机与主机在同一个局域网下,同一个局域网下的所有电脑都可以访 ...

  6. tkinter 基础教程

    目录 介绍 模块 导入方式 API 使用 主窗口 运行窗口 组件列表介绍 Label 标签 Button 按钮 Options 属性选项 文本框 Entry 单行文本框 Text 多行文本框 文本框属 ...

  7. 端口,InetSocketAddress类的使用

    端口 端口表示计算机上的一个程序的进程: 不同的进程有不同的端口号!用来区分软件 被规定:0~65535 TCP,UDP:65535*2 单个协议下,端口号不能冲突 端口分类: 公有端口:0~1023 ...

  8. Flink EOS如何防止外部系统乱入--两阶段提交源码

    一.前言 根据维基百科的定义,两阶段提交(Two-phase Commit,简称2PC)是巨人们用来解决分布式系统架构下的所有节点在进行事务提交时保持一致性问题而设计的一种算法,也可称之为协议. 在F ...

  9. git命令行or图形化界面?看这篇操作就够了

    我们在自己的私人分支开发好各自的模块后,就要合并到master,这个时候在idea里边先切换到master,然后update一下获取最新更新,解决一下冲突,最后再合并自己的私人分支,add,commi ...

  10. uniapp 实现信息推送(App)

    废话不多说直接上代码 以下代码需写在onlaunch生命周期内 onlaunch(){// onlaunch应用级生命周期 :当uni-app 初始化完成时触发(全局只触发一次) //#ifdef A ...