可以这样
可以很清楚的发现同一个折线上的点的贡献是相同的。由于都是从f1那条线开始走,所以把f1上的点的贡献算出来就行,然后想写dp,结果没写出来,搜索也不慢,复杂度o(2n),哎,菜鸡还是老实写搜索吧。然后,这道题还遇见了一个奇葩的事,在vscode 的上,ios::sync 后自己写的read()和cin混在一起用没事,但是到了codeforces上混着用就不行,而且,signed main()这种写法在codeforces上用c++11以上去交。最后一句废话,想好在写。
#include<bits/stdc++.h>
//#define int long long
#define ioss ios::sync_with_stdio(0),cin.tie(0)
using namespace std;
template<class cl>void read(cl& x)
{
x=0;int f=0;char ch;ch=getchar();
while(!isdigit(ch)){f=f|(ch=='-'),ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return ;
}
template<class cl>void put(cl x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) put(x/10);
putchar(x%10+'0');
return;
}
const int N=3e5+20;
int f[3][N];
set<pair<int,int> >p;
int n;
int ans[N];
int vis[3][N];
void dfs(int i,int z)
{
if(i<1||i>n+1) return ;//是n+1,点要多一个
if(vis[z][i]) return ;
vis[z][i]=1;// 这里要分是第一条线还是第二条线,开二维。
p.insert({i,z});
if(i!=1&&f[z][i-1]==0)
{
if(z==1)
{
dfs(i-1,2);
}
else dfs(i-1,1);
}
if(i!=n+1&&f[z][i]==1) //是i不是i+1
{
if(z==1)
{
dfs(i+1,2);
}
else
{
dfs(i+1,1);
}
}
return ;
}
signed main()
{
int t;
//read(t);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0); //这个时候最好都写cin,read(),和cin混用毒瘤评测可能不行。
cin>>t;
while(t--)
{
//read(n);
cin>>n;
string s;
cin>>s;
// cout<<s<<endl;
for(int i=1;i<=n;i++)
{
if(s[i-1]=='R')
{
f[1][i]=1;
f[2][i]=0;
}
else
{
f[1][i]=0;
f[2][i]=1; //f[2],不是f[1]
}
}
for(int i=0;i<n+5;i++)
{
vis[1][i]=0;
vis[2][i]=0;
}
int tt=0;
for(int i=1;i<=n+1;i++)
{
// tt=1;
if(vis[1][i]) continue;
p.clear();
// cout<<p.size()<<endl;
dfs(i,1);
// cout<<p.size()<<endl;
tt=p.size();
for(auto it=p.begin();it!=p.end();it++)
{
// cout<<(*it).first<<" ";
if((*it).second==1)
{
ans[(*it).first]=tt;
}
}
// cout<<endl;
// p.clear();
}
// cout<<endl;
for(int i=1;i<=n;i++)//
{
cout<<ans[i]<<" ";//这个地方要注意,有些毒瘤评测会卡这个地方多一个空格。
}
cout<<ans[n+1]<<endl;
}
}