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 ...
随机推荐
- UICollectionView
#import "ViewController.h" @interfaceViewController ()<UICollectionViewDataSource,UICol ...
- arcgis engine 监听element的添加、更新和删除事件(使用IGraphicsContainerEvents)
IGraphicsContainerEvents Interface 如何监听 element事件? 如,当我们在Mapcontrol上添加.删除.更新了一个Element后,如何捕捉到这个事件? ...
- Scene
Unity 中场景切换 http://www.cnphp6.com/archives/62868 场景管理插件Scene Manager http://blog.csdn.net/onerain88/ ...
- EXPLAINING WHAT ACTION AND FUNC ARE
http://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/ Explaining What Action A ...
- NOSDK--一键打包的实现(四)
1.4 打包及签名的脚本介绍 我们使用ant来实现打包,这节我们先介绍脚本内容,关于脚本环境配置问题,我们将在下节做一个详细的介绍. 首先我们来看下build_android/tools/platfo ...
- HTML兼容问题——HACK技术
有话先说:本文的目的主要是向大家描述一下我们在遇见IE8版本一下以及Firefox兼容的问题. 针对不同的浏览器写不同的CSS的过程,这就叫CSS hack,也叫写CSS hack,相信您会对一些比较 ...
- PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
def a2(arg): if len(arg) > 2: del arg[2:] li = [12,13,14,15] a2(li) print(li)
- weblogic虚拟路径的配置和使用
项目场景: 公司中医疗项目需要展示药品说明书的其他版本(图片或者PDF),由于其他版本文件存在Linux服务器上,由于服务器用的是weblogic, 无法直接访问文件,因此可以用weblogic的虚拟 ...
- Java高并发同步Volatile的使用
引言: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思 ...
- css实现翻页效果
如图,鼠标移动到图上,实现右上角翻页的效果,本例主要border边框的设置. 一.基本概念 <html> <head> <style> #demo{ width:0 ...