Codeforces Round #410 (Div. 2) 解题报告
Posted 惜取少年时
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
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 }
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); } }
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 }
以上是关于Codeforces Round #410 (Div. 2) 解题报告的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #410 (Div. 2) 解题报告
Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)
Codeforces Round #410 (Div. 2)-A - Mike and palindrome
[卿学姐带飞系列]-Codeforces Round #410 (Div. 2)_B - Mike and strings