蓝桥算法季度赛
全栈项目小组
分析
map使用还是不熟悉,加上审题有误
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=1e6+10;
int n;
map<string,int>a,b;
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;
string x;
char c;
for(int i=0;i<n;i++)
{
cin>>x>>c;
if(c=='F')a[x]++;
else b[x]++;
}
int ans=0;
for(auto &w:a)
{
string s=w.first;
int cnt=w.second;
if(b.count(s))ans+=min(cnt,b[s]);
}
cout<<ans;
return 0;
}
ABC
Count ABC again
分析
看数据范围就知道不是单纯从头枚举,这里子串固定(长度固定且内容固定),既然只有3个字符,那么对于每次询问修改的字符串,修改后只会是该字符的前后两个受影响(这样会重复,只取前面的)
因此,整体思路就是先统计子串个数,在修改前的位置删去相应子串数(意为重置),修改后再次统计。
代码
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=2e5+10;
int n,q,cnt;
string s;
bool check(int i)
{
return i>=0&&i+2<s.size()&&s[i]=='A'&&s[i+1]=='B'&&s[i+2]=='C';
}
void solve()
{
cin>>n>>q>>s;
int x;
char c;
for(int i=0;i<n-2;i++)
if(check(i))cnt++;
while(q--)
{
cin>>x>>c;
x--;
for(int i=x-2;i<=x;i++)if(check(i))cnt--;
s[x]=c;
for(int i=x-2;i<=x;i++)if(check(i))cnt++;
cout<<cnt<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
while(t--)solve();
return 0;
}
Buildings
很裸的单调栈(可是我没写出来,哎)
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int n;
stack<int>stk;
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;
vector<int>a(n),ans(n);
for(int &x:a)cin>>x;
for(int i=n-2;i>=0;i--)
{
while(stk.size()&&a[stk.top()]<a[i+1])
stk.pop();
stk.push(i+1);
ans[i]=stk.size();
}
for(int i=0;i<n;i++)cout<<ans[i]<<' ';
return 0;
}