• The 2018 ACM-ICPC Asia Beijing Regional Contest


    http://hihocoder.com/problemset/problem/

    #1870 : Jin Yong’s Wukong Ranking List

    我是每加1个点就dfs判断1次。

    正解是拓扑排序。。。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <ctime>
     4 #include <cstring>
     5 #include <string>
     6 #include <map>
     7 #include <set>
     8 #include <list>
     9 #include <queue>
    10 #include <vector>
    11 #include <bitset>
    12 #include <algorithm>
    13 #include <iostream>
    14 using namespace std;
    15 const int maxn=50;
    16 
    17 bool vis[maxn];
    18 char str[maxn][maxn],a[maxn],b[maxn],result1[maxn],result2[maxn];
    19 vector<int>e[maxn];
    20 int r;
    21 
    22 void dfs(int d)
    23 {
    24     vector<int>::iterator j;
    25     vis[d]=1;
    26     for (j=e[d].begin();j!=e[d].end();j++)
    27         if (!vis[*j])
    28             dfs(*j);
    29         else
    30         {
    31             r=1;
    32             return;
    33         }
    34 }
    35 
    36 int main()
    37 {
    38     int n,i,j,k,g;
    39     while (~scanf("%d",&n))
    40     {
    41         for (i=1;i<=2*n;i++)
    42             e[i].clear();
    43         g=0;
    44         r=0;
    45         for (i=1;i<=n;i++)
    46         {
    47             scanf("%s%s",a,b);
    48             for (j=1;j<=g;j++)
    49                 if (strcmp(str[j],a)==0)
    50                     break;
    51             if (j==g+1)
    52             {
    53                 g++;
    54                 strcpy(str[g],a);
    55             }
    56 
    57             for (k=1;k<=g;k++)
    58                 if (strcmp(str[k],b)==0)
    59                     break;
    60             if (k==g+1)
    61             {
    62                 g++;
    63                 strcpy(str[g],b);
    64             }
    65 
    66             e[j].push_back(k);
    67 
    68             memset(vis,0,sizeof(vis));
    69             if (r==0)
    70             {
    71                 dfs(k);
    72                 if (r==1)
    73                 {
    74                     strcpy(result1,a);
    75                     strcpy(result2,b);
    76                 }
    77             }
    78         }
    79 
    80         if (r==0)
    81             printf("0
    ");
    82         else
    83             printf("%s %s
    ",result1,result2);
    84     }
    85     return 0;
    86 }

    #1871 : Heshen's Account Book

    把所有内容放入字符串里,再判断。

    挺多细节要考虑的,代码下方有自己编的若干数据。

      1 #include <cstdio>
      2 #include <cstdlib>
      3 #include <ctime>
      4 #include <cstring>
      5 #include <string>
      6 #include <map>
      7 #include <set>
      8 #include <list>
      9 #include <queue>
     10 #include <vector>
     11 #include <bitset>
     12 #include <algorithm>
     13 #include <iostream>
     14 using namespace std;
     15 const int maxn=2e5;
     16 const int maxsinlen=20;
     17 const int maxlen=1e3+10;
     18 const int maxtotallen=3e5;
     19 const int maxline=2e2+10;
     20 
     21 char num[maxn][maxsinlen];
     22 char str[maxtotallen],s[maxlen],c;
     23 int gx[maxline];
     24 
     25 int main()
     26 {
     27     int g=0,len,line=0,ind=0,pos=0,i,j,k;
     28     bool vis=1;
     29     strcpy(str,"");
     30     while (gets(s))
     31     {
     32         strcat(str,s);
     33         strcat(str,"
    ");
     34     }
     35     len=strlen(str);
     36 
     37     for (i=0;i<len;i++)
     38     {
     39         if (str[i]=='
    ')
     40         {
     41             line++;
     42             if (i==0 || str[i-1]<'0' || str[i-1]>'9' || str[i+1]<'0' || str[i+1]>'9')
     43             {
     44                 if (vis && i>ind)
     45                 {
     46 //                    strncpy(num[g++],str+ind,i-ind);
     47                     ///delete ' ','
    '
     48                     k=0;
     49                     for (j=ind;j<i;j++)
     50                         if (str[j]>='0' && str[j]<='9')
     51                             num[g][k++]=str[j];
     52                     num[g][k]=0;
     53                     if (!(k>1 && num[g][0]=='0'))
     54                     {
     55                         g++;
     56                         gx[pos]++;
     57                     }
     58                 }
     59                 vis=1;
     60                 ind=i+1;
     61                 pos=line;
     62             }
     63         }
     64         else if (str[i]==' ')
     65         {
     66             if (vis && i>ind)
     67             {
     68 //                strncpy(num[g++],str+ind,i-ind);
     69                 ///delete ' ','
    '
     70                 k=0;
     71                 for (j=ind;j<i;j++)
     72                     if (str[j]>='0' && str[j]<='9')
     73                         num[g][k++]=str[j];
     74                 num[g][k]=0;
     75                 if (!(k>1 && num[g][0]=='0'))
     76                 {
     77                     g++;
     78                     gx[pos]++;
     79                 }
     80             }
     81             vis=1;
     82             ind=i+1;
     83             pos=line;
     84         }
     85         else
     86         {
     87             if (str[i]<'0' || str[i]>'9')
     88                 vis=0;
     89         }
     90     }
     91 
     92     if (g>=1)
     93         printf("%s",num[0]);
     94     for (i=1;i<g;i++)
     95         printf(" %s",num[i]);
     96     printf("
    ");
     97 
     98     for (i=0;i<line;i++)
     99         printf("%d
    ",gx[i]);
    100     return 0;
    101 }
    102 /**
    103 12
    104 34
    105 56
    106 78
    107 900
    108 
    109 ---
    110 
    111 003
    112 004
    113 005
    114 1 006 a
    115 
    116 ---
    117 '''
    118 
    119 23 123
    120   123 123
    121 
    122 
    123 
    124 adssa q3qe
    125 qw 1
    126 qw123
    127 12
    128 
    129 
    130 '''
    131 
    132 ---
    133 
    134 1234
    135  123
    136 
    137 ---
    138 
    139 1234
    140   12    34
    141 
    142 ---
    143 
    144 
    145 1
    146 
    147 2
    148 
    149 3
    150 
    151 as
    152 
    153 4
    154 
    155 ---
    156 
    157 12
    158 3
    159 4
    160 5a
    161 
    162 
    163 
    164 ---
    165 
    166 00
    167 
    168 ---
    169 
    170 0
    171 
    172 ---
    173 
    174 0
    175 12
    176 
    177 ---
    178 
    179 0
    180 12asdb
    181 
    182 ---
    183 
    184 '''
    185 0
    186 a
    187 0 0    0   0
    188 
    189 12 0  01 100  10 01 0
    190 0
    191 
    192 '''
    193 
    194 **/

    #1873 : Frog and Portal

    重现赛时,看错题了,难受。

    告诫自己:比赛时,一定要认真读题,认真分析数据!

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <ctime>
     4 #include <cstring>
     5 #include <string>
     6 #include <map>
     7 #include <set>
     8 #include <list>
     9 #include <queue>
    10 #include <vector>
    11 #include <bitset>
    12 #include <algorithm>
    13 #include <iostream>
    14 using namespace std;
    15 #define ll long long
    16 const int maxn=1e3+10;
    17 
    18 struct node
    19 {
    20     int x,y;
    21 }f[300];
    22 
    23 int shu[300],w;
    24 
    25 void cal(ll n)
    26 {
    27     if (n==0)
    28         w=0;
    29     else
    30     {
    31         cal(n>>1);
    32         shu[++w]=n & 1;
    33     }
    34 }
    35 
    36 int main()
    37 {
    38     ll n;
    39     int g,i,j,k;
    40     while (~scanf("%lld",&n))
    41     {
    42         w=0;
    43         cal(n);
    44 
    45         g=0;
    46         j=1;
    47         k=70;
    48 
    49         for (i=2;i<=w;i++)
    50         {
    51             ///(k+1)->(k+2)
    52             f[++g]={k+1,k+2};
    53             if (shu[i])
    54             {
    55                 f[++g]={j,k+2};
    56                 j+=2;
    57             }
    58             k+=2;
    59         }
    60         f[++g]={k,199};
    61         f[++g]={j,70};
    62         f[++g]={j+1,j+1};
    63         if (n==0)
    64             f[++g]={199,199};
    65 
    66         printf("%d
    ",g);
    67         for (i=1;i<=g;i++)
    68             printf("%d %d
    ",f[i].x,f[i].y);
    69     }
    70     return 0;
    71 }
    72 /*
    73 0
    74 1
    75 2
    76 3
    77 4
    78 
    79 4294967296
    80 4294967295
    81 4294967294
    82 
    83 */

    #1878 : Palindromes

    找规律。

    Java TLE了,难受!

    关于字符串的处理,以后别用Java写。。。

      1 #include <cstdio>
      2 #include <cstdlib>
      3 #include <ctime>
      4 #include <cstring>
      5 #include <string>
      6 #include <map>
      7 #include <set>
      8 #include <list>
      9 #include <queue>
     10 #include <vector>
     11 #include <bitset>
     12 #include <algorithm>
     13 #include <iostream>
     14 using namespace std;
     15 const int maxn=1e6+10;
     16 
     17 int shu[maxn],ori[maxn];
     18 char str[maxn];
     19 
     20 int main()
     21 {
     22     int t,len,i;
     23     scanf("%d",&t);
     24     while (t--)
     25     {
     26         scanf("%s",str);
     27         len=strlen(str);
     28         for (i=1;i<=len;i++)
     29             shu[i]=str[len-i]-48;
     30         if (str[0]>'1')
     31         {
     32             ///odd
     33             for (i=1;i<=len-1;i++)
     34                 ori[i]=0;
     35             ori[len]=2;
     36 
     37             for (i=1;i<=len;i++)
     38             {
     39                 shu[i]-=ori[i];
     40                 if (shu[i]<0)
     41                 {
     42                     shu[i]+=10;
     43                     shu[i+1]--;
     44                 }
     45             }
     46 
     47             printf("%c",shu[len]+1+48);
     48             for (i=len-1;i>=1;i--)
     49                 printf("%c",shu[i]+48);
     50             if (len>1)
     51             {
     52                 for (i=2;i<=len-1;i++)
     53                     printf("%c",shu[i]+48);
     54                 printf("%c",shu[len]+1+48);
     55             }
     56             printf("
    ");
     57         }
     58         else if (len==1)
     59             printf("0
    ");
     60         else if (str[1]=='0')
     61         {
     62             ///odd
     63             for (i=1;i<=len-2;i++)
     64                 ori[i]=0;
     65             ori[len-1]=2;
     66 
     67             for (i=1;i<=len;i++)
     68             {
     69                 shu[i]-=ori[i];
     70                 if (shu[i]<0)
     71                 {
     72                     shu[i]+=10;
     73                     shu[i+1]--;
     74                 }
     75             }
     76 
     77             printf("%c",shu[len-1]+1+48);
     78             for (i=len-2;i>=1;i--)
     79                 printf("%c",shu[i]+48);
     80             if (len-1>1)
     81             {
     82                 for (i=2;i<=len-2;i++)
     83                     printf("%c",shu[i]+48);
     84                 printf("%c",shu[len-1]+1+48);
     85             }
     86             printf("
    ");
     87         }
     88         else
     89         {
     90             ///even
     91             for (i=1;i<=len-2;i++)
     92                 ori[i]=0;
     93             ori[len-1]=1;
     94             ori[len]=1;
     95 
     96             for (i=1;i<=len;i++)
     97             {
     98                 shu[i]-=ori[i];
     99                 if (shu[i]<0)
    100                 {
    101                     shu[i]+=10;
    102                     shu[i+1]--;
    103                 }
    104             }
    105 
    106             printf("%c",shu[len-1]+1+48);
    107             for (i=len-2;i>=1;i--)
    108                 printf("%c",shu[i]+48);
    109             for (i=1;i<=len-2;i++)
    110                 printf("%c",shu[i]+48);
    111             printf("%c",shu[len-1]+1+48);
    112             printf("
    ");
    113         }
    114     }
    115     return 0;
    116 }

    #1877 : Approximate Matching

    得到所有与串S相似(相等)的串,组成一颗树,AC自动机,预处理每个节点遇到'0','1'到达的节点。

    统计每个点在某一个位置出现的次数,每次每个点遇到'0','1',到达新的节点。

    当到达叶子节点(某一个串的终止位置)时,总结果加上 该点的出现次数*2^k(k为还没确定的位置数目),同时,该节点的出现次数设置为0(以后再不出现)。

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 #define ll long long
      4 #define minv 1e-6
      5 #define inf 1e9
      6 #define pi 3.1415926536
      7 #define nl 2.7182818284
      8 const ll mod=1e9+7;//998244353
      9 const int maxn=1e5+10;
     10 
     11 ///at most 40 strings, each string contain 40 characters
     12 
     13 struct node
     14 {
     15     int c,en;
     16     ll v[2];
     17     node *pre;
     18     node *next[2];
     19     node *fail;
     20     node *num[2];
     21 };
     22 
     23 ll er[50];
     24 char str[50];
     25 queue<node*> q;
     26 
     27 int main()
     28 {
     29     node *tr,*pos,*be,*p,*d;
     30     int n,m,x,y,t,i,j,k,c;
     31     ll result;
     32     er[0]=1;
     33     for (i=1;i<=40;i++)
     34         er[i]=er[i-1]<<1;
     35 
     36     scanf("%d",&t);
     37     while (t--)
     38     {
     39         scanf("%d%d",&n,&m);
     40         scanf("%s",str);
     41         if (n>m)
     42         {
     43             printf("0
    ");
     44             continue;
     45         }
     46         tr=(node*) malloc (sizeof(node));
     47         for (i=0;i<2;i++)
     48             tr->next[i]=NULL;
     49         tr->en=0,tr->v[0]=0,tr->v[1]=0;
     50 
     51         for (i=0;i<=n;i++)
     52         {
     53             if (i!=n)
     54                 str[i]=(str[i]=='0')?'1':'0';
     55 
     56             pos=tr;
     57             for (j=0;j<n;j++)
     58             {
     59                 c=str[j]-48;
     60                 if (pos->next[c])
     61                     pos=pos->next[c];
     62                 else
     63                 {
     64                     p=(node*) malloc (sizeof(node));
     65                     for (k=0;k<2;k++)
     66                         p->next[k]=NULL;
     67                     p->en=0,p->v[0]=0,p->v[1]=0;
     68                     p->c=c;
     69 
     70                     pos->next[c]=p;
     71                     p->pre=pos;
     72                     pos=p;
     73                 }
     74             }
     75             pos->en=1;
     76 
     77             if (i!=n)
     78                 str[i]=(str[i]=='0')?'1':'0';
     79         }
     80 
     81         be=(node*) malloc (sizeof(node));
     82         for (i=0;i<2;i++)
     83             be->next[i]=tr;
     84         tr->pre=be;
     85         tr->num[0]=tr,tr->num[1]=tr;///???
     86 
     87         ///长度相等,不用不停fail判断是否存在拥有结尾标志的点
     88         q.push(tr);
     89         while (!q.empty())
     90         {
     91             d=q.front();
     92             q.pop();
     93             if (d==tr)
     94                 d->fail=be;
     95             else
     96             {
     97                 pos=d->pre->fail;
     98                 c=d->c;
     99                 while (pos->next[c]==NULL)
    100                     pos=pos->fail;
    101                 d->fail=pos->next[c];
    102 
    103                 for (j=0;j<2;j++)
    104                     if (d->fail->next[j])
    105                         d->num[j]=d->fail->next[j];
    106                     else
    107                         d->num[j]=d->fail->num[j];
    108             }
    109             for (j=0;j<2;j++)
    110                 if (d->next[j])
    111                     q.push(d->next[j]);
    112         }
    113 
    114         result=0;
    115         x=0,y=1;
    116         tr->v[0]=1;
    117         for (i=1;i<=m;i++)
    118         {
    119             q.push(tr);
    120             while (!q.empty())
    121             {
    122                 d=q.front();
    123                 for (j=0;j<2;j++)
    124                     if (d->next[j])
    125                         d->next[j]->v[y]+=d->v[x];
    126                     else
    127                         d->num[j]->v[y]+=d->v[x];
    128                 q.pop();
    129                 for (j=0;j<2;j++)
    130                     if (d->next[j])
    131                         q.push(d->next[j]);
    132             }
    133 
    134             q.push(tr);
    135             while (!q.empty())
    136             {
    137                 d=q.front();
    138 //                    printf("%d ",d->v[y]);
    139                 d->v[x]=0;
    140                 if (d->en==1)
    141                 {
    142                     result+=d->v[y]*er[m-i];
    143                     d->v[y]=0;
    144                 }
    145                 q.pop();
    146                 for (j=0;j<2;j++)
    147                     if (d->next[j])
    148                         q.push(d->next[j]);
    149             }
    150 //                printf("
    ");
    151 
    152             x=x^1,y=y^1;
    153         }
    154         printf("%lld
    ",result);
    155     }
    156     return 0;
    157 }
  • 相关阅读:
    Mysql 修改默认端口
    通过.pro文件生成C++工程
    内联函数知识点
    DICOM文件添加私有Tag(DCMTK Private Tag)
    poj 1185 炮兵阵地 状压dp
    cf #216 C
    cdoj1365 木杆上的蚂蚁
    cf #214 Dima and Salad
    cf #213 Matrix
    hdu 2222 Keywords Search(AC自动机入门题)
  • 原文地址:https://www.cnblogs.com/cmyg/p/9965712.html
Copyright © 2020-2023  润新知