Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter
Posted zero-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter相关的知识,希望对你有一定的参考价值。
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
A. Single Wildcard Pattern Matching
题意就是匹配字符的题目,打比赛的时候没有看到只有一个" * ",然后就写挫了,被hack了,被hack的点就是判一下只有一个" * "。
1 //A 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<bitset> 7 #include<cassert> 8 #include<cctype> 9 #include<cmath> 10 #include<cstdlib> 11 #include<ctime> 12 #include<deque> 13 #include<iomanip> 14 #include<list> 15 #include<map> 16 #include<queue> 17 #include<set> 18 #include<stack> 19 #include<vector> 20 using namespace std; 21 typedef long long ll; 22 23 const double PI=acos(-1.0); 24 const double eps=1e-6; 25 const ll mod=1e9+7; 26 const int inf=0x3f3f3f3f; 27 const int maxn=2*1e5+10; 28 const int maxm=100+10; 29 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 30 31 char s[maxn],t[maxn]; 32 33 int main() 34 { 35 int n,m; 36 scanf("%d%d",&n,&m); 37 scanf("%s%s",s,t); 38 int pos=-1; 39 for(int i=0;i<n;i++){ 40 if(s[i]==‘*‘){ 41 pos=i; 42 break; 43 } 44 } 45 if(pos==-1){ 46 if(n!=m) 47 cout<<"NO"<<endl; 48 else{ 49 for(int i=0;i<n;i++){ 50 if(s[i]!=t[i]){ 51 cout<<"NO"<<endl; 52 return 0; 53 } 54 } 55 cout<<"YES"<<endl; 56 } 57 } 58 else{ 59 if(m<n-1){ 60 cout<<"NO"<<endl; 61 return 0; 62 } 63 for(int i=0;i<pos;i++){ 64 if(s[i]!=t[i]){ 65 cout<<"NO"<<endl; 66 return 0; 67 } 68 } 69 for(int i=n-1,j=m-1;i>pos;i--,j--){ 70 if(s[i]!=t[j]){ 71 cout<<"NO"<<endl; 72 return 0; 73 } 74 } 75 cout<<"YES"<<endl; 76 } 77 }
B. Pair of Toys
智障题目(嘤嘤嘤~)
代码:
1 //B 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<bitset> 7 #include<cassert> 8 #include<cctype> 9 #include<cmath> 10 #include<cstdlib> 11 #include<ctime> 12 #include<deque> 13 #include<iomanip> 14 #include<list> 15 #include<map> 16 #include<queue> 17 #include<set> 18 #include<stack> 19 #include<vector> 20 using namespace std; 21 typedef long long ll; 22 23 const double PI=acos(-1.0); 24 const double eps=1e-6; 25 const ll mod=1e9+7; 26 const int inf=0x3f3f3f3f; 27 const int maxn=1e5+10; 28 const int maxm=100+10; 29 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 30 31 int main() 32 { 33 ll n,m; 34 scanf("%lld%lld",&n,&m); 35 if(2*n-1<m) 36 cout<<"0"<<endl; 37 else{ 38 ll ans; 39 if(n>=m){ 40 if(m%2==0) 41 ans=m/2-1; 42 else 43 ans=m/2; 44 } 45 else{ 46 ans=n-m/2; 47 } 48 cout<<ans<<endl; 49 } 50 }
。。。
代码:
1 //C 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<bitset> 7 #include<cassert> 8 #include<cctype> 9 #include<cmath> 10 #include<cstdlib> 11 #include<ctime> 12 #include<deque> 13 #include<iomanip> 14 #include<list> 15 #include<map> 16 #include<queue> 17 #include<set> 18 #include<stack> 19 #include<vector> 20 using namespace std; 21 typedef long long ll; 22 23 const double PI=acos(-1.0); 24 const double eps=1e-6; 25 const ll mod=1e9+7; 26 const int inf=0x3f3f3f3f; 27 const int maxn=2*1e5+10; 28 const int maxm=100+10; 29 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 30 31 char a[maxn]; 32 33 int main() 34 { 35 ios; 36 int n,k; 37 cin>>n>>k; 38 cin>>a; 39 vector<char> ans; 40 int temp=k/2,sum1=0,sum2=0; 41 for(int i=0;i<n;i++){ 42 if(sum1<temp&&a[i]==‘(‘){ 43 ans.push_back(a[i]); 44 sum1++; 45 } 46 if(a[i]==‘)‘&&sum2<sum1){ 47 ans.push_back(a[i]); 48 sum2++; 49 } 50 51 } 52 for(int i=0;i<k;i++) 53 cout<<ans[i]; 54 cout<<endl; 55 }
这题想一下就会发现是只要两个相同的数之间没有比它小的就可以,就是保存一下数第一次出现和最后一次出现的位置,然后查询一下这个区间就可以,如果有0的话就进行填充。
这个题我是用RMQ(ST)进行查询的,在初始化的时候,如果有0就把0变成2e5+1,因为数据最大2e5,然后区间查询就可以了,关于RMQ(ST),以前写过博客,有兴趣的可以看一下
这个题坑点很多,首先如果这个序列一开始的最大值比m小,并且没有0,那么就是NO,有0就先把一个0变成m,然后填充的时候,如果一开始的最大值就是0,说明全部为0,那么直接把所有0变成m然后输出就可以了。其他的具体的看代码吧,写了注释。
代码:
1 //D-区间查询最值,RMQ查询 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<bitset> 7 #include<cassert> 8 #include<cctype> 9 #include<cmath> 10 #include<cstdlib> 11 #include<ctime> 12 #include<deque> 13 #include<iomanip> 14 #include<list> 15 #include<map> 16 #include<queue> 17 #include<set> 18 #include<stack> 19 #include<vector> 20 using namespace std; 21 typedef long long ll; 22 23 const double PI=acos(-1.0); 24 const double eps=1e-6; 25 const ll mod=1e9+7; 26 const int inf=0x3f3f3f3f; 27 const int maxn=2*1e5+10; 28 const int maxm=100+10; 29 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 30 31 int a[maxn],mm[maxn][maxm],mi[maxn][maxm]; 32 int n,m,MIN,MAX; 33 34 void RMQ() 35 { 36 for(int i=1;i<=n;i++){ 37 if(a[i]!=0) 38 mm[i][0]=mi[i][0]=a[i]; 39 else 40 mm[i][0]=mi[i][0]=2*1e5+1;//把0变成最大的 41 } 42 for(int j=1;(1<<j)<=n;j++){ 43 for(int i=1;i+(1<<j)-1<=n;i++){ 44 mm[i][j]=max(mm[i][j-1],mm[i+(1<<(j-1))][j-1]); 45 mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]); 46 } 47 } 48 } 49 50 void ST(int l,int r) 51 { 52 int k=0; 53 while((1<<(k+1))<=r-l+1)k++; 54 MAX=max(mm[l][k],mm[r-(1<<k)+1][k]); 55 MIN=min(mi[l][k],mi[r-(1<<k)+1][k]); 56 } 57 58 vector<int> vec[maxn];//保存数出现的所有位置 59 60 int main() 61 { 62 cin>>n>>m; 63 int flag=0,maxx=-1,pos=0; 64 for(int i=1;i<=n;i++){ 65 cin>>a[i]; 66 maxx=max(maxx,a[i]); 67 if(a[i]==0)pos=i; 68 vec[a[i]].push_back(i); 69 } 70 if(maxx<m&&maxx>0&&pos!=0) a[pos]=m;//如果一开始所有数都小于m,就把一个0变成m 71 else if(maxx==0){//如果所有数都为0,直接全变成0然后输出就可以了 72 for(int i=1;i<=n;i++) 73 a[i]=m; 74 cout<<"YES"<<endl; 75 for(int i=1;i<=n-1;i++) 76 cout<<a[i]<<" "; 77 cout<<a[n]<<endl; 78 return 0; 79 } 80 else if(maxx<m&&pos==0){//如果最大值小于m并且没有0,就是NO 81 cout<<"NO"<<endl; 82 return 0; 83 } 84 RMQ(); 85 for(int i=1;i<=m;i++){ 86 if(vec[i].size()!=0){ 87 int l=vec[i][0];//值为i的数第一次出现的位置 88 int r=vec[i][vec[i].size()-1];//最后一次出现的位置 89 ST(l,r); 90 if(MIN<i){//查询区间的最小值 91 flag=1; 92 break; 93 } 94 } 95 } 96 if(flag==1){ 97 cout<<"NO"<<endl; 98 return 0; 99 } 100 for(int i=1;i<=n;i++){ 101 if(a[i]==0){ 102 for(int j=i+1;j<=n;j++){//从当前位置找第一个不为0的数 103 if(a[j]==0) continue; 104 else{ 105 a[i]=a[j]; 106 break; 107 } 108 } 109 if(a[i]==0) a[i]=a[i-1];//如果右端点全为0,就填充左边的数 110 } 111 } 112 cout<<"YES"<<endl; 113 for(int i=1;i<=n-1;i++) 114 cout<<a[i]<<" "; 115 cout<<a[n]<<endl; 116 }
嘤嘤嘤,溜了。
以上是关于Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #504 E - Down or Right 交互题
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) D. Array Restoration(示例代码
E - Down or Right Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)