模拟105 题解

A. 小W的魔术

考虑问题的逆问题,怎样的字符串是好的字符串。

即长度为$n$,前缀与给定字符串的前缀匹配,后缀与给定字符串的后缀匹配的字符串个数。

不妨枚举给定字符串的断开点,那么答案即$(len+1)*26^{n-len}$

然而这里面有重复计算的方案,把它画出来就可以发现,

相邻两次枚举,重复计算的方案是固定的,扣除重复的答案就好了。

 

 

 

B. 小Y的图

显然是最小生成树,然后问题转化为树上两点唯一路径上的最大值。

倍增/树剖维护这个东西就好了。

 

 

 

C. 小L的数

一个结论是:

任何一个数的答案不会超过4。

考虑四个组合,分别为$01,02,04,08$。

因为对应着二进制位,每一位都可以被这四个组合拼出来。

所以只要判断答案是否为1/2/3,如果都不是,答案为4。

对于答案为1,情况是简单的,只要拆开$n$看一下是不是好数。

对于答案为2/3,考虑进行一个数位$dp$。

以答案为$3$为例,因为$(x,x)$可以被$(0,x)$表示出来,不同的集合共有45个。

枚举构成答案选择的可重集合$(a,b),(c,d),(e,f)$。

设$dp(i,0/1/2,S)$表示到考虑到第$i$位,当前位的加法进位为0/1/2,

已经到达前导零的状压集合为$S$,其中对应位为0表示还没到达前导0,为1则表示已经到达前导0。

从低到高枚举每一位,可以进行简单dp,然而打起来还挺麻烦的,更好的办法是学习$yxs$大神的预处理,然后就好了。

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cstdio>
  5 #define ll long long
  6 #define int short
  7 using namespace std;
  8 const int mo[40]={0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0};
  9 const int ch[40]={0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2};
 10 int cnt,w;
 11 int r[20],vis[20],s[105];
 12 bool dp[20][3][8];
 13 inline int calc(ll x,int ret=0){
 14     w=0; while(r[++w]=x%10,x/=10);
 15     for(int i=0;i<=9;++i) vis[i]=0;
 16     for(int i=1;i<=w;++i) if(!vis[r[i]]) vis[r[i]]=1,++ret;
 17     return ret;
 18 }
 19 inline int query(ll x){
 20     if(calc(x)<=2) return 1;
 21     for(int i=1;i<=cnt;++i) for(int j=i;j<=cnt;++j){
 22         memset(dp,0,sizeof(dp));
 23         int a=s[i]/10,b=s[i]%10,c=s[j]/10,d=s[j]%10;
 24         for(int st=0;st<4;++st) dp[1][0][st]=1;
 25         for(int u=1;u<=w;++u){
 26             for(int v=0;v<2;++v){
 27                 if(dp[u][v][0]){
 28                     if(mo[v+a+c]==r[u]) dp[u+1][ch[v+a+c]][0]=dp[u+1][ch[v+a+c]][1]=dp[u+1][ch[v+a+c]][2]=dp[u+1][ch[v+a+c]][3]=1;
 29                     if(mo[v+a+d]==r[u]) dp[u+1][ch[v+a+d]][0]=dp[u+1][ch[v+a+d]][1]=dp[u+1][ch[v+a+d]][2]=dp[u+1][ch[v+a+d]][3]=1;
 30                     if(mo[v+b+c]==r[u]) dp[u+1][ch[v+b+c]][0]=dp[u+1][ch[v+b+c]][1]=dp[u+1][ch[v+b+c]][2]=dp[u+1][ch[v+b+c]][3]=1;
 31                     if(mo[v+b+d]==r[u]) dp[u+1][ch[v+b+d]][0]=dp[u+1][ch[v+b+d]][1]=dp[u+1][ch[v+b+d]][2]=dp[u+1][ch[v+b+d]][3]=1;
 32                 }
 33                 if(dp[u][v][1]){
 34                     if(mo[v+c]==r[u]) dp[u+1][ch[v+c]][1]=dp[u+1][ch[v+c]][3]=1;
 35                     if(mo[v+d]==r[u]) dp[u+1][ch[v+d]][1]=dp[u+1][ch[v+d]][3]=1;
 36                 }
 37                 if(dp[u][v][2]){
 38                     if(mo[v+a]==r[u]) dp[u+1][ch[v+a]][2]=dp[u+1][ch[v+a]][3]=1;
 39                     if(mo[v+b]==r[u]) dp[u+1][ch[v+b]][2]=dp[u+1][ch[v+b]][3]=1;
 40                 }
 41                 if(dp[u][v][3]) if(v==r[u]) dp[u+1][0][3]=1;
 42             }
 43         }
 44         for(int st=0;st<4;++st) if(dp[w+1][0][st]) return 2;
 45     }
 46     for(int i=1;i<=cnt;++i) for(int j=i;j<=cnt;++j) for(int k=j;k<=cnt;++k){
 47         memset(dp,0,sizeof(dp));
 48         int a=s[i]/10,b=s[i]%10,c=s[j]/10,d=s[j]%10,e=s[k]/10,f=s[k]%10;
 49         for(int st=0;st<8;++st) dp[1][0][st]=1;
 50         for(int u=1;u<=w;++u){
 51             for(int v=0;v<3;++v){
 52                 if(dp[u][v][0]){
 53                     if(mo[v+a+c+e]==r[u]) dp[u+1][ch[v+a+c+e]][0]=dp[u+1][ch[v+a+c+e]][1]=dp[u+1][ch[v+a+c+e]][2]=dp[u+1][ch[v+a+c+e]][3]=1,
 54                                            dp[u+1][ch[v+a+c+e]][4]=dp[u+1][ch[v+a+c+e]][5]=dp[u+1][ch[v+a+c+e]][6]=dp[u+1][ch[v+a+c+e]][7]=1;
 55                     if(mo[v+a+c+f]==r[u]) dp[u+1][ch[v+a+c+f]][0]=dp[u+1][ch[v+a+c+f]][1]=dp[u+1][ch[v+a+c+f]][2]=dp[u+1][ch[v+a+c+f]][3]=1,
 56                                            dp[u+1][ch[v+a+c+f]][4]=dp[u+1][ch[v+a+c+f]][5]=dp[u+1][ch[v+a+c+f]][6]=dp[u+1][ch[v+a+c+f]][7]=1;
 57                     if(mo[v+a+d+e]==r[u]) dp[u+1][ch[v+a+d+e]][0]=dp[u+1][ch[v+a+d+e]][1]=dp[u+1][ch[v+a+d+e]][2]=dp[u+1][ch[v+a+d+e]][3]=1,
 58                                            dp[u+1][ch[v+a+d+e]][4]=dp[u+1][ch[v+a+d+e]][5]=dp[u+1][ch[v+a+d+e]][6]=dp[u+1][ch[v+a+d+e]][7]=1;
 59                     if(mo[v+a+d+f]==r[u]) dp[u+1][ch[v+a+d+f]][0]=dp[u+1][ch[v+a+d+f]][1]=dp[u+1][ch[v+a+d+f]][2]=dp[u+1][ch[v+a+d+f]][3]=1,
 60                                            dp[u+1][ch[v+a+d+f]][4]=dp[u+1][ch[v+a+d+f]][5]=dp[u+1][ch[v+a+d+f]][6]=dp[u+1][ch[v+a+d+f]][7]=1;
 61                     if(mo[v+b+c+e]==r[u]) dp[u+1][ch[v+b+c+e]][0]=dp[u+1][ch[v+b+c+e]][1]=dp[u+1][ch[v+b+c+e]][2]=dp[u+1][ch[v+b+c+e]][3]=1,
 62                                            dp[u+1][ch[v+b+c+e]][4]=dp[u+1][ch[v+b+c+e]][5]=dp[u+1][ch[v+b+c+e]][6]=dp[u+1][ch[v+b+c+e]][7]=1;
 63                     if(mo[v+b+c+f]==r[u]) dp[u+1][ch[v+b+c+f]][0]=dp[u+1][ch[v+b+c+f]][1]=dp[u+1][ch[v+b+c+f]][2]=dp[u+1][ch[v+b+c+f]][3]=1,
 64                                            dp[u+1][ch[v+b+c+f]][4]=dp[u+1][ch[v+b+c+f]][5]=dp[u+1][ch[v+b+c+f]][6]=dp[u+1][ch[v+b+c+f]][7]=1;
 65                     if(mo[v+b+d+e]==r[u]) dp[u+1][ch[v+b+d+e]][0]=dp[u+1][ch[v+b+d+e]][1]=dp[u+1][ch[v+b+d+e]][2]=dp[u+1][ch[v+b+d+e]][3]=1,
 66                                            dp[u+1][ch[v+b+d+e]][4]=dp[u+1][ch[v+b+d+e]][5]=dp[u+1][ch[v+b+d+e]][6]=dp[u+1][ch[v+b+d+e]][7]=1;
 67                     if(mo[v+b+d+f]==r[u]) dp[u+1][ch[v+b+d+f]][0]=dp[u+1][ch[v+b+d+f]][1]=dp[u+1][ch[v+b+d+f]][2]=dp[u+1][ch[v+b+d+f]][3]=1,
 68                                            dp[u+1][ch[v+b+d+f]][4]=dp[u+1][ch[v+b+d+f]][5]=dp[u+1][ch[v+b+d+f]][6]=dp[u+1][ch[v+b+d+f]][7]=1;    
 69                 }
 70                 if(dp[u][v][1]){
 71                     if(mo[v+c+e]==r[u]) dp[u+1][ch[v+c+e]][1]=dp[u+1][ch[v+c+e]][3]=dp[u+1][ch[v+c+e]][5]=dp[u+1][ch[v+c+e]][7]=1;
 72                     if(mo[v+c+f]==r[u]) dp[u+1][ch[v+c+f]][1]=dp[u+1][ch[v+c+f]][3]=dp[u+1][ch[v+c+f]][5]=dp[u+1][ch[v+c+f]][7]=1;
 73                     if(mo[v+d+e]==r[u]) dp[u+1][ch[v+d+e]][1]=dp[u+1][ch[v+d+e]][3]=dp[u+1][ch[v+d+e]][5]=dp[u+1][ch[v+d+e]][7]=1;
 74                     if(mo[v+d+f]==r[u]) dp[u+1][ch[v+d+f]][1]=dp[u+1][ch[v+d+f]][3]=dp[u+1][ch[v+d+f]][5]=dp[u+1][ch[v+d+f]][7]=1;
 75                 }
 76                 if(dp[u][v][2]){
 77                     if(mo[v+a+e]==r[u]) dp[u+1][ch[v+a+e]][2]=dp[u+1][ch[v+a+e]][3]=dp[u+1][ch[v+a+e]][6]=dp[u+1][ch[v+a+e]][7]=1;
 78                     if(mo[v+a+f]==r[u]) dp[u+1][ch[v+a+f]][2]=dp[u+1][ch[v+a+f]][3]=dp[u+1][ch[v+a+f]][6]=dp[u+1][ch[v+a+f]][7]=1;
 79                     if(mo[v+b+e]==r[u]) dp[u+1][ch[v+b+e]][2]=dp[u+1][ch[v+b+e]][3]=dp[u+1][ch[v+b+e]][6]=dp[u+1][ch[v+b+e]][7]=1;
 80                     if(mo[v+b+f]==r[u]) dp[u+1][ch[v+b+f]][2]=dp[u+1][ch[v+b+f]][3]=dp[u+1][ch[v+b+f]][6]=dp[u+1][ch[v+b+f]][7]=1;
 81                 }
 82                 if(dp[u][v][4]){
 83                     if(mo[v+a+c]==r[u]) dp[u+1][ch[v+a+c]][4]=dp[u+1][ch[v+a+c]][5]=dp[u+1][ch[v+a+c]][6]=dp[u+1][ch[v+a+c]][7]=1;
 84                     if(mo[v+a+d]==r[u]) dp[u+1][ch[v+a+d]][4]=dp[u+1][ch[v+a+d]][5]=dp[u+1][ch[v+a+d]][6]=dp[u+1][ch[v+a+d]][7]=1;
 85                     if(mo[v+b+c]==r[u]) dp[u+1][ch[v+b+c]][4]=dp[u+1][ch[v+b+c]][5]=dp[u+1][ch[v+b+c]][6]=dp[u+1][ch[v+b+c]][7]=1;
 86                     if(mo[v+b+d]==r[u]) dp[u+1][ch[v+b+d]][4]=dp[u+1][ch[v+b+d]][5]=dp[u+1][ch[v+b+d]][6]=dp[u+1][ch[v+b+d]][7]=1;
 87                 }
 88                 if(dp[u][v][3]){
 89                     if(mo[v+e]==r[u]) dp[u+1][ch[v+e]][3]=dp[u+1][ch[v+e]][7]=1;
 90                     if(mo[v+f]==r[u]) dp[u+1][ch[v+f]][3]=dp[u+1][ch[v+f]][7]=1;
 91                 }
 92                 if(dp[u][v][5]){
 93                     if(mo[v+c]==r[u]) dp[u+1][ch[v+c]][5]=dp[u+1][ch[v+c]][7]=1;
 94                     if(mo[v+d]==r[u]) dp[u+1][ch[v+d]][5]=dp[u+1][ch[v+d]][7]=1;
 95                 }
 96                 if(dp[u][v][6]){
 97                     if(mo[v+a]==r[u]) dp[u+1][ch[v+a]][6]=dp[u+1][ch[v+a]][7]=1;
 98                     if(mo[v+b]==r[u]) dp[u+1][ch[v+b]][6]=dp[u+1][ch[v+b]][7]=1;
 99                 }
100                 if(dp[u][v][7]){ if(v==r[u]) dp[u+1][0][7]=1; }
101             }
102         }
103         for(int st=0;st<8;++st) if(dp[w+1][0][st]) return 3;
104     }
105     return 4;
106 }
107 signed main(){
108     freopen("number.in","r",stdin);
109     freopen("number.out","w",stdout);
110     for(int i=0;i<=9;++i) for(int j=i+1;j<=9;++j) s[++cnt]=i*10+j;
111     long long x; int q; scanf("%hd",&q);
112     for(int i=1;i<=q;++i) scanf("%lld",&x),printf("%hd\n",query(x));
113     return 0;
114 }
T3
posted @ 2019-11-08 16:26  skyh  阅读(216)  评论(0编辑  收藏  举报