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 ...
随机推荐
- Gravatar注册
今天在学习falsk时需要用到头像扩展,需要使用gravatar到网上查了查好像没有被墙,就试着用qq邮箱注册了一个账号,结果等了好长时间也没有等到激活邮箱,就百度了一下发现了一个技巧,原来这封邮件被 ...
- tamtam-nuget-imageserver
https://bitbucket.org/tamtam-nl/tamtam-nuget-imageserver/src/eaddb1ac943fcaa9e7ef210ed5a5ccf630b8699 ...
- Nginx 301重定向设置
server { server_name www.***.com ***.com; if ($host != 'www.***.com' ) { rewrite ^/(.*)$ http://www. ...
- 关于js中的时间处理
关于js编程, 主要是, 绝大部分是用 jquery. 但是, js原生的一些方法和属性也是要掌握的, 这个只是在 遇到的时候, 记一下就好了, 如: event的relatedTarget属性: 主 ...
- jQuery radio取值,checkbox取值,select取值
语法解释: $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 var checkTex ...
- 【重点】Shell入门教程:流程控制(3)条件判断式的真假值
之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及 ...
- update语句关联表更新
UPDATE dbo.NodeInstance SET OrderNumber=temp.OrderNo FROM dbo.NodeInstance ins,dbo.NodeTemplate temp ...
- Fragment间的通信
在网上看到的一篇文章,总结的很好 为了重用Fragment的UI组件,创建的每个Fragment都应该是自包含的.有它自己的布局和行为的模块化组件.一旦你定义了这些可重用的Fragment,你就可以把 ...
- [BZOJ1112][POI2008]砖块Klo
[BZOJ1112][POI2008]砖块Klo 试题描述 N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖,放到另 ...
- popoverPresentationController UIPopoverController 使用方法详解
之前iPad特有的控件,现在iPhone亦可使用. 点击按钮,弹出popOverVC. 按钮的点击事件: - (IBAction)pickOrderAction:(UIButton *)sender ...