AtCoder Grand Contest 020 (AGC020) E - Encoding Subsets 动态规划
原文链接www.cnblogs.com/zhouzhendong/p/AGC020E.html
前言
真 \(\cdot\) 信仰型动态规划
题解
我们可以采用信仰型动态规划解决此题。
设 \(dp[S]\) 表示 S 这个字符串的所有子集可以被编码成多少种。
那么分两种情况转移:
不编码,答案是子集总数。
考虑枚举最左边的一处编码,递归DP。
时间复杂度 \(O(信仰)\) 。
时间复杂度证明?详见官方题解。反正我没去看。
代码
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof x)
#define For(i,a,b) for (int i=(a);i<=(b);i++)
#define Fod(i,b,a) for (int i=(b);i>=(a);i--)
#define fi first
#define se second
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define outval(x) cerr<<#x" = "<<x<<endl
#define outtag(x) cerr<<"---------------"#x"---------------"<<endl
#define outarr(a,L,R) cerr<<#a"["<<L<<".."<<R<<"] = ";\
For(_x,L,R)cerr<<a[_x]<<" ";cerr<<endl;
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
typedef __int128 LG;
const int N=105,mod=998244353;
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=(LL)x*x%mod)
if (y&1)
ans=(LL)ans*x%mod;
return ans;
}
void Add(int &x,int y){
if ((x+=y)>=mod)
x-=mod;
}
void Del(int &x,int y){
if ((x-=y)<0)
x+=mod;
}
int Add(int x){
return x>=mod?x-mod:x;
}
int Del(int x){
return x<0?x+mod:x;
}
int n;
char s[N];
int a[N];
int pw2[N];
map <LG,int> dp,vis;
void write(LG x){
if (x>9)
write(x/10);
putchar('0'+x%10);
}
LG Get(LG a,int L,int R){
return a>>L&(((LG)1<<(R-L+1))-1);
}
int DP(LG K){
if (vis[K])
return dp[K];
vis[K]=1;
int ans=0,k=K>>n;
if (!k)
return dp[K]=1;
LG S=Get(K,0,n-1);
For(i,0,k-1)
if (S>>i&1)
ans++;
ans=pw2[ans];
int cnt=0;
For(i,0,k-1){
For(j,i,k-1){
int len=j-i+1;
if (j+len>k-1)
break;
LG v=Get(S,i,j);
for (int t=i+len;t+len-1<k;t+=len){
v&=Get(S,t,t+len-1);
Add(ans,(LL)pw2[cnt]*DP(v|(LG)len<<n)%mod
*DP(Get(S,t+len,k-1)|(LG)(k-(t+len))<<n)%mod);
}
}
if (S>>i&1)
cnt++;
}
return dp[K]=ans;
}
int main(){
cin>>s;
n=strlen(s);
pw2[0]=1;
For(i,1,n)
pw2[i]=Add(pw2[i-1]<<1);
For(i,0,n-1)
a[i]=s[i]-'0';
LG S=0;
For(i,0,n-1)
S|=(LG)a[i]<<i;
S|=(LG)n<<n;
write(DP(S));
puts("");
return 0;
}
AtCoder Grand Contest 020 (AGC020) E - Encoding Subsets 动态规划的更多相关文章
- Atcoder Grand Contest 020 E - Encoding Subsets(记忆化搜索+复杂度分析)
Atcoder 题面传送门 & 洛谷题面传送门 首先先考虑如果没有什么子集的限制怎样计算方案数.明显就是一个区间 \(dp\),这个恰好一年前就做过类似的题目了.我们设 \(f_{l,r}\) ...
- Atcoder Grand Contest 020 F - Arcs on a Circle(DP+小技巧)
Atcoder 题面传送门 & 洛谷题面传送门 一道难度 unavailable 的 AGC F 哦 首先此题最棘手的地方显然在于此题的坐标可以为任意实数,无法放入 DP 的状态,也无法直接计 ...
- AtCoder Grand Contest 020
A - Move and Win Time limit : 1sec / Memory limit : 512MB Score : 300 points Problem Statement A gam ...
- AtCoder Grand Contest 020 D - Min Max Repetition
q<=1000个询问,每次问a,b,c,d:f(a,b)表示含a个A,b个B的字符串中,连续A或连续B最小的串中,字典序最小的一个串,输出这个串的c到d位.a,b<=5e8,d-c+1&l ...
- AtCoder Grand Contest 020 题解
传送门 怎么又是\(tourist\)神仙的题-- \(A\) 咕咕 int n,a,b; int main(){ scanf("%d%d%d",&n,&a,&am ...
- AtCoder Grand Contest 002 (AGC002) F - Leftmost Ball 动态规划 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC002F.html 题目传送门 - AGC002F 题意 给定 $n,k$ ,表示有 $n\times k$ ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
随机推荐
- R_基本统计分析_06
summary()提供基础的统计信息 sapply(x,FUN,options)可以指定统计函数 fivenum()可以返回图基五数 Hmisc 中的describe(data)返回变量,观测的变量, ...
- 在safari下input的placeholder设置行高失效
在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font- ...
- linux驱动开发手记【2】
1./dev目录下,主设备号和次设备号.ls -l可以通过第一个字母是c或者b区分是字符设备或者是块设备.主设备号标识设备对应的驱动程序. 2.分配设备编号: 如果我们提前明确知道所需要的设备编号,则 ...
- Flask之WTfroms组件
一.WTfroms简介 WTForms插件是类似于django的form组件的插件,可以帮我们写标签,校验数据等. 二.安装与使用 安装: pip install WTForms 使用: from w ...
- [转] 雷电三和typec傻傻分不清
原文:https://club.lenovo.com.cn/thread-4921715-1-1.html 因为形状完全一致,所以很多人都误以为Type-C=雷电3. 实际上,雷电3只是采用了Type ...
- Mongodb的主从复制
主从服务器的实现原理 首先,主节点会把本服务的与写有关的操作记录下来,读操来不记录,这些操作就记录在local数据库中的oplog.$admin这个集合中,这是一个固定集合,大小是可以配置的,主要是通 ...
- 原生JavaScript和jQuery的较量
JavaScript和jQuery有很多相似知促,那么二者又是如何进行较量,我们先了解一下什么是JavaScript和jQuery,知其源头,才能知其所以然. 简介: [JavaScript] 一种直 ...
- machine learning (3)---Linear Algebra Review
Matrix Vector Multiplication 左边的矩阵向量相乘法比右边的更简洁而且计算高效 Matrix Matrix Multiplication 可以同时计算12个结果(4个房子面积 ...
- EPL II 编程打印
一.EPL II 格式及打印测试 注意N命令前的换行和最后P1后的换行.将此段代码复制到windows记事本里另存为Print.ext,文件名随便,后缀为ext.然后通过cmd控制命令行输入" ...
- java中的String要点解析
String类使我们经常使用的一个类,经常用来表示字符串常量. 字符串一旦被创建赋值,就不能被改变,因为String 底层是数组实现的,且被定义成final类型.我们可以看String源码. /** ...