CF 615C
每次取模式串的某个子串去对比然后更新当前索引就可以了
void solve(){
string s,t;
cin>>s>>t;
int lenp=s.size(),leno=t.size();
vector<vector<int>>ans;
bool matched=false;
for(int j=0;j<t.size();++j){//origin
int cur_len=-1;
matched=false;
ans.push_back(vector<int>(2));
for(int i=0;i<s.size();++i){//pattern
if(s[i]==t[j]){
matched=true;
int l=i,r=l;
int k=0;
for(int k=1;i+k<s.size()&&j+k<t.size();++k){
if(s[i+k]==t[j+k])++r;
else break;
}
if(r-l+1>cur_len){
cur_len=r-l;
ans.back()[0]=l;
ans.back()[1]=r;
}
l=r=i;
k=0;
for(int k=1;i-k>=0&&j+k<t.size();++k){
if(s[i-k]==t[j+k])--l;
else break;
}
if(r-l+1>cur_len){
cur_len=r-l;
ans.back()[0]=r;
ans.back()[1]=l;
}
}
}
if(!matched){
break;
}
j+=cur_len;
}
if(!matched){
cout<<-1<<'\n';
}else{
cout<<ans.size()<<'\n';
for(auto k:ans){
cout<<k[0]+1<<' '<<k[1]+1<<'\n';
}
}
return;
}
CF 513G
暴力搜就好了
void solve(){
int n,k;
cin>>n>>k;
vector<int>a(n);
for(int i=0;i<n;++i)cin>>a[i];
double sum=0;
for(int i=1;i<=n;++i)sum+=1.0*i;
function<double(int)>dfs=[&](int num){
if(num==0){
double total=0.0;
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
if(a[i]>a[j]){
total+=1.0;
}
}
}
return total;
}
double cur=0;
for(int i=0;i<n;++i){
for(int j=i+1;j<=n;++j){
reverse(a.begin()+i,a.begin()+j);
cur+=dfs(num-1);
reverse(a.begin()+i,a.begin()+j);
}
}
return cur/sum;
};
cout.precision(10);
cout<<dfs(k)<<'\n';
return;
}