D. Journey ###K //K

 题目链接:https://codeforces.ml/contest/1476/problem/D

题意:有0~n个城市 给定字符串 s[i] 代表从i到i-1的 有向边

每一次走过后 所有边的方向会改变,问从每个起点开始 最多能走到多少个不同的城市

思路: 可以发现,假设在当前的位置可以往右走,那么就可以再走回来,走回来的时候一定是偶数步数的,

所以当开始的时候可以往右也可以往左走,那么最终就可以算上两边的贡献,可以发现,只需要知道从当前开始

往后/前连续一段最长的不相等的符号即可, 维护pre[i] 代表从i开始向前扩展的最长前缀,suf[i] 从i开始往后扩展的最长后缀

两者相加再加1即是答案, 注意要s[i]=='L s[i+1]=='R' 能往那边走的时候才计算答案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=3e5+10;
 4 const int mod=1e9+7;
 5 #define ll long long
 6 #define pi pair<int,int>
 7 #define fi first
 8 #define sc second
 9 #define pb push_back
10 
11 
12 
13 char s[maxn];
14 int pre[maxn],suf[maxn];
15 
16 
17 int main()
18 {
19     ios::sync_with_stdio(0);
20     cin.tie(0);
21     int t;
22     cin>>t;
23     while(t--)
24     {
25         int n;
26         cin>>n;
27         cin>>s+1;
28         for(int i=1;i<=n;i++)
29         {
30             pre[i]=1;
31             if(s[i]!=s[i-1]) pre[i]+=pre[i-1];
32         }
33         suf[n+1]=0;
34         for(int i=n;i>=1;i--)
35         {
36             suf[i]=1;
37             if(s[i]!=s[i+1]) suf[i]+=suf[i+1];
38         }
39         for(int i=0;i<=n;i++)
40         {
41             int tmp=1;
42             if(s[i]=='L') tmp+=pre[i];
43             if(s[i+1]=='R') tmp+=suf[i+1];
44             cout<<tmp<<" ";
45         }
46         cout<<'\n';
47     }
48 
49 
50 
51 
52 
53 }
View Code

 

posted @ 2021-01-30 22:05  canwinfor  阅读(210)  评论(0)    收藏  举报