zoukankan      html  css  js  c++  java
  • 模拟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
    ",query(x));
    113     return 0;
    114 }
    T3
  • 相关阅读:
    Python字符串
    ListCtrl控件
    leetcode1004
    leetcode1003
    leetcode1002
    leetcode153
    leetcode540
    leetcode435
    leetcode999
    leetcode997
  • 原文地址:https://www.cnblogs.com/skyh/p/11821147.html
Copyright © 2011-2022 走看看