jzoj3363
JYY 来到了一个新的城市,为了和大家保持联系,第一件事就是办理新的手机号。JYY 对号码的要求很高,希望大家都能够顺畅地阅读手机号,因此 JYY 特别研究了地球人的电话号码阅读习惯,有如下重大发现 (请自行代入你们的手机号码):地球人总是按照以下四种方式来朗读电话号码:
xxx-xxx-xxxxx 例如 151-958-83019
xxx-xxxx-xxxx 例如 151-9588-3019
xxxx-xxxx-xxx 例如 1519-5883-019
xxxx-xxx-xxxx 例如 1519-588-3019
即便是同一个电话号码,不同的人也会按照自己的习惯去解读,例如有些人会觉得电话号码是151-9588-3019,而有些却坚持 1519-588-3019。
为了让号码显得更上口,JYY 认为有些不吉利的数字串,在报电话号码时永远不应该被完整地读出来,例如,JYY 认为 7456 是不吉利的数字串 (气死我了),那么 13000007456 就是一个不好的号码,因为有人会把这个号码读作 130-000-07456,而在最后一次完整地读出了 7456。然而,13000745600 却不是一个不好的号码,因为无论怎么读,7456 都会被拆分开来。
现在给出 JYY 认为不吉利的数字串,请你计算满足 JYY 要求的电话号码,总共有多少个。具体来说说,一个好的电话号码满足以下要求:
电话号码是以 1 开头的 11 位数字串。
这个号码无论按照之前描述的 4 种读法中的哪个,都不能在任意时刻连续读出不吉利的数字串。
dp,設f[i][j]表示i位前五位為j的方案數,從後到前枚舉每一位
f[0][0]=1;枚舉更大的一位為0-9,f[i][nxt]=f[i-1][j]
然而有些方案不合法,要減去。我們可以考慮設常量數組a來表示不合法的狀態位置
則在i==a[i]的位置時,從前往後檢測是否不合法
預處理出一個數組g,g[i]表示與i相同的子串個數,且開頭從小到大在字符串的g[i][j]位
每次判定j時枚舉g的j,k位,當我們發現現在的g j k比b[l][0]要小,那麼可以取到這個值。f[i][j]不合法
最後取所有f[11][j%100000==1]的每一位即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll st[]={0,5,4,3,8,8,7,7,11,11},le[]={0,5,4,3,3,4,4,3,3,4},len[110],num[110],f[12][100010],n,tw[15],g[100010][110];
char s[110][20];
int main(){
tw[0]=1;
for(ll i=1;i<=13;i++)
tw[i]=tw[i-1]*10;
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%s",s[i]+1);
len[i]=strlen(s[i]+1);
for(ll j=len[i];j>=1;j--)
num[i]=num[i]*10+s[i][j]-'0';
}
f[0][0]=1;
for(ll i=1;i<=n;i++)
for(ll j=0;j<=99999;j++){
int v=0;
for(ll k=1;k<=6-len[i];k++)
if(j%tw[len[i]+k-1]/tw[k-1]==num[i]){
v=len[i]+k-1;
break;
}
if(v)g[j][++g[j][0]]=v;
}
for(ll i=1;i<=11;i++){
for(ll j=0;j<=99999;j++)
for(ll k=0;k<=9;k++)
f[i][j%10000*10+k]+=f[i-1][j];
for(ll j=1;j<=9;j++)
if(st[j]==i)
for(int k=0;k<=99999;k++)
if(f[i][k])
for(int l=1;l<=g[k][0];l++)
if(g[k][l]<=le[j]){
f[i][k]=0;
break;
}
}
ll ans=0;
for(ll i=0;i<=99999;i++)
if(i%10==1)
ans+=f[11][i];
printf("%lld",ans);
}
jzoj3363的更多相关文章
随机推荐
- sphinx文档
Navigation index modules | Sphinx主页 | 文档 » 下载 目前版本: 1.2 获得 Sphinx 从 Python Package Index, 或者使用如下命令安装 ...
- Luogu 3959 [NOIP2017] 宝藏- 状压dp
题解 真的想不到这题状压的做法...听说还有跑的飞快的模拟退火,要是现场做绝对滚粗QAQ. 不考虑深度,先预处理出 $pt_{i, S}$ 表示让一个不属于 集合 $S$ 的 点$i$ 与点集 $S$ ...
- 老板说你的UI设计的不高级?你肯定没用这7个技巧...
对于每个网页设计师而言,在设计过程中总会碰到需要作出设计决策的时候.也许你的公司并没有全职设计师,而需求上则要求设计出全新的UI:又或者你正在制作一个你自己的个人项目,而你希望它比 Bootstrap ...
- [VBScript] 自动删除2小时以前生成的文件
保存为deleteTempFiles.vbs,双击即可运行 dim folder, file, mFSO, subfolder Set mFSO = CreateObject("Script ...
- 莫烦python课程里面的bug修复;课程爬虫小练习爬百度百科
我今天弄了一下午修改这个代码,最后还是弄好了.原因是正则表达式的筛选不够准确,有时候是会带http:baidu这些东西的.所以需要一个正则表达式的断言,然后还有一点是如果his里面只有一个元素就不要再 ...
- python协程函数、递归、匿名函数与内置函数使用、模块与包
目录: 协程函数(yield生成器用法二) 面向过程编程 递归 匿名函数与内置函数的使用 模块 包 常用标准模块之re(正则表达式) 一.协程函数(yield生成器用法二) 1.生成器的语句形式 a. ...
- 服务器的日志一直报Packet for query is too large (7632997 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.的解决方法
服务器的日志一直报Packet for query is too large (7632997 > 4194304). You can change this value on the serv ...
- 2018.10.13 bzoj1070: [SCOI2007]修车(费用流)
传送门 费用流经典题目. 自我感觉跟TheWindy′sThe Windy'sTheWindy′s很像. 利用费用提前计算的思想来建图就行了. 代码: #include<bits/stdc++. ...
- 2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)
传送门 对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案. 代码: #include<bits/stdc++. ...
- hdu-1394(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 思路:建立一个空线段树,求出逆序数,(逆序数性质:交换两个相邻数,逆序数+1或-1, 交换两个不 ...