ABC329
A
略
B
排序后遍历一下即可
C
void solve(){
int n;cin>>n;
string s;cin>>s;s=" "+s;
vector<int>cnt(26);
vector<int>a(26);
rep(i,1,n){
int k=s[i]-'a';
a[k]++;
if(i>=2&&k!=(s[i-1]-'a')){
a[s[i-1]-'a']=0;
}
cnt[k]=max(cnt[k],a[k]);
}
int ans=0;
rep(i,0,25){
ans+=cnt[i];
}
cout<<ans<<endl;
}
D
模拟
void solve(){
int n,m;cin>>n>>m;
vector<int>tot(n+1);
int ans=0;
int temp=0;
while(m--){
int x;cin>>x;
tot[x]++;
if(tot[x]>ans){
ans=tot[x];
temp=x;
}else if(tot[x]==ans){
if(x<temp)temp=x;
}
cout<<temp<<endl;
}
}
E
题意:
从一个######序列,不断拓印T,可以相互覆盖,是否能得到给定字符串S
思路:
倒过来看
字符串可以左边一部分被覆盖,右边一部分被覆盖,只剩下中间一部分
从左至右和从右至左删除满足条件的字符串即可
void solve(){
int n,m;cin>>n>>m;
string s,t;cin>>s>>t;
for(int i=0;i<n;i++){
int ok=1;
for(int j=0;j<m;j++){
if(s[i+j]==t[j]||s[i+j]=='#')continue;
else {
ok=0;break;
}
}
if(ok){
for(int j=0;j<m;j++){
s[i+j]='#';
}
}
}
for(int i=n-1;i>=0;i--){
int ok=1;
for(int j=0;j<m;j++){
if(s[i+j]==t[j]||s[i+j]=='#')continue;
else{
ok=0;break;
}
}
if(ok){
for(int j=0;j<m;j++){
s[i+j]='#';
}
}
}
for(int i=0;i<n;i++){
if(s[i]!='#'){
cout<<"No"<<endl;return;
}
}
cout<<"Yes"<<endl;
}
F
题意:
每个编号都有一个集合,每次把一个集合元素转移到另一个集合中,并输出这个集合的元素种类
思路:
启发式合并,把小集合合并到大集合中
时间复杂度为Qlogn
unordered_set<int>a[maxn];
void solve(){
int n,q;cin>>n>>q;
rep(i,1,n){
int x;cin>>x;
a[i].insert(x);
}
while(q--){
int l,r;cin>>l>>r;
// a[r].insert(a[l].begin(),a[l].end());
// a[l].clear();
if(a[r].size()>a[l].size()){
a[r].insert(a[l].begin(),a[l].end());
a[l].clear();
}else{
a[l].insert(a[r].begin(),a[r].end());
a[r].clear();
swap(a[l],a[r]);
}
cout<<a[r].size()<<endl;
}
}

浙公网安备 33010602011771号