原题链接: https://codeforces.com/gym/101306
A
题记:用马拉车算法找出字符串里最长的回文串,用数组center存下每个答案的中心位置,r记录半径,之后输出即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int center[N];
int sum=0;
void Manacher(string s){
string t="$#";
for(int i=0;i<s.size();i++){
t+=s[i];
t+="#";
}
vector<int>p(t.size(),0);
int mx=0,id=0,r=0;
for(int i=1;i<t.size();++i){
p[i]=mx>i?min(p[2*id-i],mx-i):1;
while(t[i+p[i]]==t[i-p[i]]){
++p[i];
}
if(mx<i+p[i]){
mx=i+p[i];//跟新当前最长回文串能延伸到最右的位置
id=i;//保存最长回文串的中间位置
}
if(r<p[i]){
r=p[i];
sum=0;
center[sum++]=i;
}
else if(r==p[i])
center[sum++]=i;
}
cout<<sum<<endl;
for(int i=0;i<sum;i++){
cout<<s.substr((center[i]-r)/2,r-1)<<endl;
}
}
int main(){
int n;
cin>>n;
string s;
cin>>s;
Manacher(s);
return 0;
}
B
题记:按照题目模拟即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int main(){
int k,n,m;
cin>>k>>n>>m;
string s;
int sum=0;
for(int i=0;i<k;i++){
cin>>s;
if(s=="Mars")
sum++,n--;
}
k-=sum;
if(n>0)
m+=n;
if(m-k>0)
cout<<m-k<<endl;
else
cout<<"0"<<endl;
return 0;
}
C
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[25];
int main(){
int n,x,y;
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
for(int j=x;j<y;j++)
a[j]++;
}
int ans=0;
for(int i=0;i<=24;i++)
ans=max(ans,a[i]);
cout<<ans<<endl;
return 0;
}
D
E
F
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef long long ll;
int main(){
int t;
cin>>t;
while(t--){
ll n,m,x,ans,sum;
cin>>n>>m>>x;
if(n/2>=m)
ans=m*(n-m)*x,sum=m;
else
ans=(n/2)*(n-n/2)*x,sum=n/2;
cout<<sum<<" "<<ans<<endl;
}
return 0;
}