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 }

浙公网安备 33010602011771号