Codeforces Round #607 题解
A题
签到题
B题
只需要贪心的调换成只能经过一次调换的最小字符串,再与目标串比较
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int main(){ int t; cin>>t; while(t--){ string s; string p; cin>>s>>p; string t=s; int fa=0; sort(t.begin(),t.end()); for(int i=0;i<s.size();i++){ if(t[i]!=s[i]){ for(int j=s.size()-1;j>i;j--){ if(s[j]==t[i]){ swap(s[j],s[i]); fa=1; break; } } } if(fa) break; } if(s<p) cout<<s<<endl; else{ cout<<"---"<<endl; } } }
C题
本题如果直接暴力会超时,因此我们发现,我们无需关心在比X大的字符串的内容,因为不会被用到,那么当字符串比x大的时候,只需要通过公式计算答案即可
注意因为我们在过程中不断取模,所以很可能导致负数,经过多年的做题经验,我发现模数是很神奇的东西,所以我们应当尽量多的地方加模数,防止差错,并且本题要注意爆int
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const ll mod=1e9+7; int main(){ int t; cin>>t; while(t--){ string s; int x; cin>>x>>s; int i; ll ans=s.size(); for(i=0;i<x;i++){ if(s.size()>x){ ans=(ans+(ans-(i+1)+mod)%mod*(s[i]-'1'))%mod; // 因为ans在不断取模,所以可能小于0 } else{ if(s[i]=='2') s+=s.substr(i+1); else if(s[i]=='3') s+=s.substr(i+1)+s.substr(i+1); ans=s.size(); } } cout<<ans%mod<<endl; } }
没有人不辛苦,只有人不喊疼