牛客练习赛51
A:https://ac.nowcoder.com/acm/contest/1083/A
题意:
给出字符串s只包含abc,问你字符串中包含abc子串的个数
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long char s[100010]; int main() { scanf("%s",s+1); int l = strlen(s+1); ll ans = 0,prea = 0,preab = 0; for(int i=1;i<=l;i++){ if(s[i] == 'a'){ prea++; } if(s[i] == 'b'){ if(prea){ preab += prea; } } if(s[i] == 'c'){ ans += preab; } } cout<<ans<<endl; return 0; }
B:https://ac.nowcoder.com/acm/contest/1083/B
题意:
给出一个字符串s1,给出m个询问,每次询问输入一个字符串s2,s2是否是s1的子串
题解:
vector存放每一个字母的下标,
遍历s2的每一个字母
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxx = 1e5+10; vector<int> v[40]; vector<int>::iterator it; char s1[maxx],s2[55]; int main() { int n,m; scanf("%d%d",&n,&m); scanf("%s",s1+1); for(int i=1;i<=n;i++){ v[s1[i]-'a'].push_back(i); } while(m--) { int x = 0; int flag = 0; scanf("%s",s2+1); int len = strlen(s2+1); for(int i=1;i<=len;i++){ vector<int> &now = v[s2[i]-'a']; it = upper_bound(now.begin(),now.end(),x); if(it == now.end()){ flag = 1;break; } x = *it; } if(flag){ printf("NO\n"); }else{ printf("YES\n"); } } return 0; }
C:https://ac.nowcoder.com/acm/contest/1083/C
题意:
输入n,是否能找到另外俩条边a,b,使得a,b,n构成直角三角形,如果不能输出-1,否则输出俩条边
题解:
勾股数定理
当a为大于1的奇数2n+1时,b=2n^2+2n, c=2n^2+2n+1
当a为大于4的偶数2n时,b=n^2-1, c=n^2+1
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long ll pow(ll x) { return x*x; } int main() { ll n; cin>>n; if(n <= 2){ printf("-1\n"); } if(n%2){ n = (n-1)/2; printf("%lld %lld\n",2*1ll*pow(n)+2*n,2*1ll*pow(n)+2*n+1); }else{ n = n/2; printf("%lld %lld\n",1ll*pow(n)-1,1ll*pow(n)+1); } return 0; }
D:https://ac.nowcoder.com/acm/contest/1083/D
题意:
在一个长为400的数轴上,有n只羊,每只羊都会在固定的[l,r]区间的下标上吃草,一只羊只能吃一个下标的草,不能多个羊吃同一个下标的草。
每次询问在[l,r]区间上最多有多少只羊在吃草。
题解:
multiset,贪心
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long const int maxx = 410; int a[maxx],b[maxx]; int main() { int n,m,l,r,ans = 0; cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); while(m--) { ans = 0; multiset<int> s; scanf("%d%d",&l,&r); for(int i=1;i<=n;i++){ if(a[i] < l && b[i] >= l) s.insert(b[i]); } for(int i=l;i<=r;i++){ for(int j=1;j<=n;j++) if(a[j] == i) s.insert(b[j]); if(s.size()){ ans++,s.erase(s.begin()); } s.erase(i); } cout<<ans<<endl; } return 0; }