zoukankan      html  css  js  c++  java
  • Codeforces Round #410 (Div. 2) 解题报告

    A.

    因为A的题意导致这次罚时比较多……注意change一定是必须得改成不一样的,如a改成a是不行的。

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <queue>
     8 #include <set>
     9 #include <map>
    10 #include <list>
    11 #include <stack>
    12 #define mp make_pair
    13 typedef long long ll;
    14 typedef unsigned long long ull;
    15 const int MAX=1e6+1000;
    16 const int INF=1e9+5;
    17 using namespace std;
    18 typedef pair<int,int> pii;
    19 string x;
    20 string y;
    21 int cnt=0,len;
    22 int main()
    23 {
    24     cin>>x;
    25     y=x;
    26 //    cout<<y;
    27     len=x.length();
    28     reverse(x.begin(),x.end());
    29 //    cout<<x<<endl;
    30     for(int i=0;i<len/2;++i)
    31     {
    32         if(x[i]!=y[i])
    33             ++cnt;
    34     }
    35 //    printf("%d
    ",cnt);
    36     if(cnt==1||(cnt==0&&(len%2==1)))
    37         printf("YES
    ");
    38     else
    39     printf("NO
    ");
    40 }
    View Code

    B.

    将第一个作为KMP的匹配串,滚动若干次,求f(next)数组,之后将所有串复制一倍放在后面,对每个串KMP。成功的条件为全都匹配成功,不然就是NO。

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <queue>
     8 #include <set>
     9 #include <map>
    10 #include <list>
    11 #include <stack>
    12 #define mp make_pair
    13 typedef long long ll;
    14 typedef unsigned long long ull;
    15 const int MAX=1e6+1000;
    16 const int INF=1e9+5;
    17 using namespace std;
    18 typedef pair<int,int> pii;
    19 int f[MAX];
    20 string x;
    21 string a[100];
    22 int ci[100];
    23 int n;
    24 int an,he;
    25 void getf(string x,int m)//m���ij���
    26 {
    27     f[0]=f[1]=0;
    28     for(int i=2,j=0;i<=m;i++)
    29     {
    30         while(j&&x[j+1]!=x[i])
    31             j=f[j];
    32         if(x[j+1]==x[i])
    33             j++;
    34         f[i]=j;
    35     }
    36 }
    37 int kmp(string x,string y)//��y��ƥ��x
    38 {
    39     getf(x,x.size());
    40     for(int i=1,j=0;i<=y.size();i++)
    41     {
    42         while(j&&x[j+1]!=y[i])
    43             j=f[j];
    44         if(x[j+1]==y[i])
    45             j++;
    46         if(j>=x.size()-1)
    47             return i-j;
    48     }
    49     return -1;
    50 }
    51 int main()
    52 {
    53     scanf("%d",&n);
    54     string tem;
    55     int len;
    56     for(int i=0;i<n;i++)
    57     {
    58         cin>>a[i];
    59         a[i]=a[i]+a[i];
    60     }
    61     len=a[0].length()/2;
    62 //    printf("%d
    ",len);
    63     an=INF;
    64     for(int i=0;i<len;i++)
    65     {
    66 //        he=0;
    67         tem=" "+a[0].substr(i,len);
    68         getf(tem,tem.length());
    69 //        cout<<tem<<endl;
    70         he=i;
    71         for(int j=1;j<n;j++)
    72         {
    73             int l;
    74             l=kmp(tem," "+a[j]);
    75             if(l==-1)
    76             {
    77                 printf("-1
    ");
    78                 return 0;
    79             }
    80             he+=l;
    81         }
    82         an=min(he,an);
    83     }
    84     printf("%d
    ",an);
    85 
    86 }
    View Code

    C.

    容易发现对于两个数连续做2次之后就都是偶数。2个奇数操作一次就成为偶数。先对本身所有数求gcd,如果有公共因子则已经成立,不然就按照上述规则,将所有数变为偶数。

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    #include <set>
    #include <map>
    #include <list>
    #include <stack>
    #define mp make_pair
    typedef long long ll;
    typedef unsigned long long ull;
    const int MAX=1e6+1000;
    const int INF=1e9+5;
    using namespace std;
    typedef pair<int,int> pii;
    int gcd(int x,int y)
    {
        if(y==0)
            return x;
        return gcd(y,x%y);
    }
    int gccd;
    int a[MAX];
    int n;
    int ci;
    int cnt;
    int main()
    {
        scanf("%d",&n);
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        gccd=a[0];
        for(i=1;i<n;++i)
        {
            gccd=gcd(gccd,a[i]);
            if(gccd==1)
                break;
        }
        if(i==n)
        {
            printf("YES
    0
    ");
            return 0;
        }
        else
        {
            ci=cnt=0;
            a[n]=0;
            for(i=0;i<=n;++i)
            {
                if(a[i]%2)
                    ++cnt;
                else
                {
                    ci+=cnt/2;
                    cnt%=2;
                    if(cnt)
                        ci+=2;
                    cnt=0;
                }
            }
            printf("YES
    %d
    ",ci);
        }
    }
    View Code

    D.

    实在是太套路的一个题目……只描述奇数的情况,偶数随便取一个数之后就变成了奇数的情况。按A排序,取第一个。之后下标2k,2k+1两个数取其中b大的。按这种构造方法得到的即为符合题意的解。

     1 #include <string>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <iostream>
     6 #include <cmath>
     7 #include <queue>
     8 #include <set>
     9 #include <map>
    10 #include <list>
    11 #include <stack>
    12 #define mp make_pair
    13 typedef long long ll;
    14 typedef unsigned long long ull;
    15 const int MAX=1e5+1000;
    16 const int INF=1e9+5;
    17 using namespace std;
    18 typedef pair<int,int> pii;
    19 int n;
    20 struct node
    21 {
    22     int a,b,j;
    23 }x[MAX];
    24 bool cmp(node c,node d)
    25 {
    26     if(c.a!=d.a)
    27         return c.a>d.a;
    28     else
    29         return c.b>d.b;
    30 }
    31 int main()
    32 {
    33     scanf("%d",&n);
    34     for(int i=1;i<=n;++i)
    35         {
    36             scanf("%d",&x[i].a);
    37             x[i].j=i;
    38         }
    39     for(int i=1;i<=n;++i)
    40         scanf("%d",&x[i].b);
    41     sort(x+1,x+1+n,cmp);
    42     printf("%d
    ",n/2+1);
    43     printf("%d ",x[1].j);
    44     for(int i=1;i<=(n-1)/2;++i)
    45     {
    46         if(x[2*i].b>x[2*i+1].b)
    47             printf("%d ",x[2*i].j);
    48         else
    49             printf("%d ",x[2*i+1].j);
    50     }
    51     if(n%2==0)
    52     {
    53         printf("%d ",x[n].j);
    54     }
    55     printf("
    ");
    56 }
    View Code
  • 相关阅读:
    数据库——数据操作——数据的增删改(8)
    数据库——完整性约束(7)
    数据库——数据类型(6)
    生成代码的代码 之 POJO生成器 之二 模板实现
    生成代码的代码 之 错误代码类生成器
    生成代码的代码 之 POJO生成器
    [翻译] Trident-ML:基于storm的实时在线机器学习库
    Vim实用技巧系列
    基于循环数组的无锁队列
    Vim实用技巧系列
  • 原文地址:https://www.cnblogs.com/quintessence/p/6751725.html
Copyright © 2011-2022 走看看