首页 > 代码库 > Codeforces Round #410 (Div. 2) 解题报告

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\n",cnt);
36     if(cnt==1||(cnt==0&&(len%2==1)))
37         printf("YES\n");
38     else
39     printf("NO\n");
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????????
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\n",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\n");
78                 return 0;
79             }
80             he+=l;
81         }
82         an=min(he,an);
83     }
84     printf("%d\n",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\n0\n");
        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\n%d\n",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",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("\n");
56 }
View Code

 

Codeforces Round #410 (Div. 2) 解题报告