P9183 [USACO23OPEN] FEB B
题目描述
贝西和埃尔希正在密谋最终推翻他们的主人——农夫约翰!他们通过NNN条短信进行计划。他们的对话可以用一个长度为NNN的字符串SSS来表示。
其中SiS_iSi是字母B或E,这意味着第iii条消息分别由贝西或埃尔希发送的。
然而,农夫约翰听说了这个消息,并试图拦截他们的谈话。因此,字符串SSS的一些字母是F,这意味着农夫约翰混淆了信息,发件人未知(贝西、埃尔希都有可能)。
注:约翰没有发送信息!他只是在干扰奶牛间的通话!
未混淆对话的兴奋程度是一只奶牛重复发送信息的次数。也就是说,子串BB或EE在SSS中出现的次数。你想找到原始信息的兴奋程度,但你不知道约翰的信息中哪一条实际上是贝西或埃尔希的。在所有可能的情况下,从小到大输出所有可能的兴奋程度。
输入格式
第一行:一个整数NNN(通话长度)。
第二行:一个字符串SSS(通话内容)。
输出格式
第一行:输出一个整数KKK,为不同兴奋程度的可能数量。
随后KKK行:每行一个整数,为每种兴奋程度。注意按照从小到大的顺序输出。
输入输出样例 #1
输入 #1
4 BEEF输出 #1
2 1 2输入输出样例 #2
输入 #2
9 FEBFEBFEB输出 #2
2 2 3输入输出样例 #3
输入 #3
10 BFFFFFEBFE输出 #3
3 2 4 6说明/提示
1≤N≤2×1051 \le N \le 2 \times 10^51≤N≤2×105。
- 测试点 4~8:N≤10N \le 10N≤10
- 测试点 9~20:无额外限制。
C++实现
#include<bits/stdc++.h>#definexfirst#defineysecondusingnamespacestd;intn,d=2;string st;intl(){intans=0;string t=st;for(inti=1;i<n;i++)if(t[i]=='F')if(t[i-1]=='B')t[i]='E';elset[i]='B';for(inti=1;i<n;i++)ans+=(t[i-1]==t[i]);returnans;}intr(){intans=0;string t=st;for(inti=1;i<n;i++)if(t[i]=='F')t[i]=t[i-1];for(inti=1;i<n;i++)ans+=(t[i-1]==t[i]);returnans;}intmain(){inti;cin>>n>>st;if(st[0]=='F'||st[n-1]=='F')d=1;if(st[0]!='F'){intx=l(),y=r();cout<<(y-x)/d+1<<endl;for(i=x;i<=y;i+=d)cout<<i<<endl;return0;}st[0]='B';intx=l(),y=r();st[0]='E';x=min(x,l());y=max(y,r());cout<<(y-x)/d+1<<endl;for(i=x;i<=y;i+=d)cout<<i<<endl;}后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容