<span>模拟105 题解</span>
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 }