社区讨论
站内 P11451 7分求助 急!!!
题目总版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m57votkt
- 此快照首次捕获于
- 2024/12/28 15:46 去年
- 此快照最后确认于
- 2025/11/04 12:15 4 个月前
[USACO24DEC] It's Mooin' Time B
题目描述
Farmer John 正在试图向 Elsie 描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。他说「竞赛中我最喜欢的部分是 Bessie 说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。
Elsie 仍然不理解,所以 Farmer John 将竞赛以文本文件形式下载,并试图解释他的意思。竞赛被定义为一个长度为 ()的小写字母字符串。一种哞叫一般地定义为子串 ,其中某字符 之后紧跟着 个某字符 ,且 。根据 Farmer John 的说法,Bessie 哞叫了很多,所以如果某种哞叫在竞赛中出现了至少 ()次,那可能就是 Bessie 发出的。
然而,Farmer John 的下载可能损坏,文本文件可能存在至多一个字符与原始文件不同。将可能的误差考虑在内,输出所有可能是 Bessie 发出的哞叫,按字典序顺序排序。
输入格式
输入的第一行包含 和 ,表示字符串的长度以及 Bessie 的哞叫的频次下限。
第二行包含一个长度为 的小写字母字符串,表示竞赛。
输出格式
输出可能是 Bessie 发出的哞叫的数量,以下是按字典序排序的哞叫列表。每行输出一种哞叫。
样例 #1
样例输入 #1
CPP10 2
zzmoozzmoo
样例输出 #1
CPP1
moo
样例 #2
样例输入 #2
CPP17 2
momoobaaaaaqqqcqq
样例输出 #2
CPP3
aqq
baa
cqq
样例 #3
样例输入 #3
CPP3 1
ooo
样例输出 #3
CPP25
aoo
boo
coo
doo
eoo
foo
goo
hoo
ioo
joo
koo
loo
moo
noo
poo
qoo
roo
soo
too
uoo
voo
woo
xoo
yoo
zoo
提示
样例 #1 解释
在这个样例中,任何字符变化都不会影响答案。唯一 Bessie 可能发出的哞叫是 。
样例 #2 解释
在这个样例中,位置 (从零开始索引)的 可能是由 损坏导致的,这使得 成为一种 Bessie 发出两次的可能的哞叫。此外,位置 的 可能是由 损坏导致的,这使得 成为一种 Bessie 可能的哞叫。 可以通过将 换成 来达到。
测试点性质
- 测试点 1-3:样例。
- 测试点 4-8:。
- 测试点 9-13:没有额外限制。
#include<bits/stdc++.h>
using namespace std;
int sum[4000007];
bool sk[4000007];
int n,m,ans;
char s[100005],p;
int main() {
cin>>n>>m;
scanf("%s",s+1);
for(int i=1; i<=n; i++) {
s[i]-='a';
}
for(int i=1; i<=n-2; i++) {
if(s[i+1]==s[i+2]&&s[i+1]!=s[i]) {
sum[s[i]*10000+s[i+1]*100+s[i+2]]++;
}
}
for(int i=1; i<=400005; i++) {
if(sum[i]>=m) {
sk[i]=1;
}
}
for(int i=1; i<=n; i++) {
p=s[i];
for(int j=0; j<26; j++) {
s[i]=j;
int a=sum[s[i-2]*10000+s[i-1]*100+s[i]],b=sum[s[i-1]*10000+s[i]*100+s[i+1]],c=sum[s[i]*10000+s[i+1]*100+s[i+2]];
if(s[i-1]==p&&p!=s[i-2] && !(s[i-1]==s[i]&&s[i]!=s[i-2])) {
sum[s[i-2]*10000+s[i-1]*100+s[i]]--;
}else if(s[i-1]==s[i]&&s[i]!=s[i-2] && !(s[i-1]==p&&p!=s[i-2])) {
sum[s[i-2]*10000+s[i-1]*100+s[i]]++;
}
if(p==s[i+1]&&p!=s[i-1] && !(s[i]==s[i+1]&&s[i]!=s[i-1])) {
sum[s[i-1]*10000+s[i]*100+s[i+1]]--;
}else if(s[i]==s[i+1]&&s[i+1]!=s[i-1] && !(p==s[i+1]&&p!=s[i-1])) {
sum[s[i-1]*10000+s[i]*100+s[i+1]]++;
}
if(s[i+1]==s[i+2]&&s[i+2]!=p && !(s[i+1]==s[i+2]&&s[i+2]!=s[i])) {
sum[s[i]*10000+s[i+1]*100+s[i+2]]--;
}else if(s[i+1]==s[i+2]&&s[i+2]!=s[i] && !(s[i+1]==s[i+2]&&s[i+2]!=p)) {
sum[s[i]*10000+s[i+1]*100+s[i+2]]++;
}
if(sum[s[i-2]*10000+s[i-1]*100+s[i]]>=m)sk[s[i-2]*10000+s[i-1]*100+s[i]]=1;
if(sum[s[i-1]*10000+s[i]*100+s[i+1]]>=m)sk[s[i-1]*10000+s[i]*100+s[i+1]]=1;
if(sum[s[i]*10000+s[i+1]*100+s[i+2]]>=m)sk[s[i]*10000+s[i+1]*100+s[i+2]]=1;
sum[s[i-2]*10000+s[i-1]*100+s[i]]=a;
sum[s[i-1]*10000+s[i]*100+s[i+1]]=b;
sum[s[i]*10000+s[i+1]*100+s[i+2]]=c;
}
s[i]=p;
}
for(int i=1; i<=400005; i++) {
if(sk[i]==1) {
ans++;
}
}
cout<<ans<<"\n";
for(int i=1; i<=400005; i++) {
if(sk[i]==1) {
cout<<char(i/10000+'a')<<char(i/100%100+'a')<<char(i%100+'a')<<"\n";
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...