BZOJ2471 : Count
考虑KMP,设$f[i][j][S]$表示还剩最低$i$位没有确定,目前KMP匹配到了$j$这个位置,前缀匹配情况是$S$,最终会匹配到哪里,中途匹配成功几次。
其中$S[i]$是一个pair<int,long long>,表示对于前面已经确定的高位,如果从$i$开始匹配,那么最终会匹配到哪里,中途匹配成功几次。
对于$f[i][j][S]$的计算,可以枚举最高的还没确定的那一位,重新计算$S$,并将子状态的结果合并。
用记忆化搜索实现这个过程,有效状态数不会很多。
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
typedef long long ll;
struct P{
int x;ll y;
P(){}
P(int _x,ll _y){x=_x,y=_y;}
P operator+(const P&b){return P(b.x,y+b.y);}
}g[10][9],ans;
map<string,P>f[20][9];
int n,m,i,j,k,nxt[9];char a[9];
P dfs(int n,int x,string s){
if(!n)return P(s[x]&7,s[x]>>3);
if(f[n][x].find(s)!=f[n][x].end())return f[n][x][s];
P v(x,0);
for(int i=0;i<10;i++){
string o=s;
for(int j=0;j<m;j++){
P t(s[j]&7,s[j]>>3);
t=t+g[i][t.x];
o[j]=t.x|(t.y<<3);
}
v=v+dfs(n-1,v.x,o);
}
return f[n][x][s]=v;
}
int main(){
while(~scanf("%d%s",&n,a+1)){
if(!n)return 0;
m=strlen(a+1);
for(i=1;i<=m;i++)a[i]-='0';
for(nxt[1]=j=0,i=2;i<=m;nxt[i++]=j){
while(j&&a[j+1]!=a[i])j=nxt[j];
if(a[j+1]==a[i])j++;
}
for(i=0;i<m;i++)for(j=0;j<10;j++){
for(k=i;k&&a[k+1]!=j;k=nxt[k]);
if(a[k+1]==j)k++;
if(k<m)g[j][i]=P(k,0);else g[j][i]=P(nxt[k],1);
}
for(i=0;i<n;i++)for(j=0;j<m;j++)f[i][j].clear();
ans=P(0,0);
for(i=0;i<n;i++)for(j=1;j<10;j++){
string o="";
for(k=0;k<m;k++){
P t=g[j][k];
o+=char(t.x|(t.y<<3));
}
ans=ans+dfs(i,ans.x,o);
}
printf("%lld\n",ans.y);
}
}
BZOJ2471 : Count的更多相关文章
- nodejs api 中文文档
文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- [PHP源码阅读]count函数
在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现. 我在gi ...
- EntityFramework.Extended 实现 update count+=1
在使用 EF 的时候,EntityFramework.Extended 的作用:使IQueryable<T>转换为update table set ...,这样使我们在修改实体对象的时候, ...
- 学习笔记 MYSQL报错注入(count()、rand()、group by)
首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table group by x; 然后对于攻击载荷进行解释, floor(rand( ...
- count(*) 与count (字段名)的区别
count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
随机推荐
- 迭代器学习之一:使用IEnumerable和IEnumerator接口
写博客是检验我学习的成果之一以及自我总结的一种方式,以后会经常利用这种方式进行技术交流和自我总结,其中认识不深难免会有错误,但是一直懂得不懂就问,不懂就学的道理! 1.首先看一个简单的列子 , , , ...
- 直接操作 SDL_Overlay YUV叠加上的像素
根据这篇解码出yuv数据后 海思h264解码库 y,u,v数据全部存进数组内, IntPtr y = _decodeFrame.pY; IntPtr ...
- API接口:分页
// 查询满足要求的总记录数 $count = M("back")->where($back_map)->count(); $pagecount = ceil($cou ...
- Verilog笔记——YUV2RGB的模块测试
1 YUV2RGB的模块如下: module yuv2rgb( clk, //时钟输入 rstn, //复位输入,低电平复位 y_in, //变换前Y分量输出 cb_in, //变换前Cb分量输出 c ...
- Login Reference for PhotoSomething
Android Background Processing with Handlers and AsyncTask and Loaders - Tutorial http://www.vogella. ...
- 如何设置phpMyAdmin自动登录和取消自动登录
如何设置phpMyAdmin自动登录? 首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php(如果已经存在 config.inc.php 文件,则直 ...
- php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径
采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快. 一,函数原型 arra ...
- Form 详细属性--2016年12月4日
属性 名称 说明 AcceptButton 获取或设置当用户按 Enter 键时所单击的窗体上的按钮. AccessibilityObject 获取分配给该控件的 Accessib ...
- xampp本地配置多域名
xampp内建apache服务器,也是可以配置vhosts的 1. 打开httpd.conf文件,搜索vhosts 发现这句话: # Virtual hosts Include conf/extra/ ...
- HDU 5102 The K-th Distance(模拟)
题意:输入一棵树,输出前k小的点对最短距离dis(i,j)的和. 模拟,官方题解说得很清楚了.不重复了. http://bestcoder.hdu.edu.cn/ 需要注意的是,复杂度要O(n+k), ...