原文链接www.cnblogs.com/zhouzhendong/p/AGC020E.html

前言

真 \(\cdot\) 信仰型动态规划

题解

我们可以采用信仰型动态规划解决此题。

设 \(dp[S]\) 表示 S 这个字符串的所有子集可以被编码成多少种。

那么分两种情况转移:

  1. 不编码,答案是子集总数。

  2. 考虑枚举最左边的一处编码,递归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;
}

最新文章

  1. 子DIV设置margin-top影响父DIV位置的解决办法
  2. Java内存模型深度解析:重排序 --转
  3. mysql常用单行函数
  4. Fiddler实战深入研究(二)
  5. 爱你.一万年&gt;&gt;数据库基础
  6. Yii2登陆添加验证码
  7. linux matlab2013b 安装教程
  8. leetcode:Rotate Array
  9. bzoj1068:[SCOI2007]压缩
  10. Java操作属性文件,支持新增或更新多个属性
  11. ASP中 Request.Form中文乱码的解决方法
  12. Android项目---TouchListener
  13. springMVC和json结合传递数据
  14. IIS7.5 用 IIS AppPool\应用程序池名 做账号 将各站点权限分开
  15. github git 在GitHub上创建项目并将本地项目push到网站上
  16. https的证书认证 iOS版
  17. poj2373 Dividing the Path (单调队列+dp)
  18. Codeforces 837F Prefix Sums
  19. 微信小程序学习笔记1--小程序的代码构成
  20. 记一次Spring的aop代理Mybatis的DAO所遇到的问题

热门文章

  1. oracle 触发器的实例(转)
  2. Windows10如何卸载OneDrive
  3. kubernetes第十章--ConfigMap 管理配置
  4. AJAX 初识
  5. 结合模板导出PDF文件
  6. mysql 的使用
  7. JavaScript仿百度图片浏览效果(转载)
  8. SpringCloud2.0 Turbine 断路器集群监控 基础教程(九)
  9. php5.6 的mcrypt_encrypt 函数可以和5.5.9的行为一样
  10. c++中结构体的使用