0%

第五届上海理工大学程序设计全国挑战赛-I-In Falsus

思路讲解

那么容易想到,原来出现过的 $a???a??\rightarrow aaaaa??

$ 并不会增加。

a?a?????c??c?aaa?????cccc?a?a?????c??c?→aaa?????cccc?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(int i=0;i<M;++i){
char ch=i+'a';
vector<ll> pos;
for(int j=1;j<=N;++j){
if(S[j]==ch){
pos.push_back(j);
}
}
if(pos.size()>=2){
for(int i=pos[0];i<=pos.back();++i){
if(S[i]=='?'){
S[i]=ch;
}
}
}
}

那么继续,我们把拆贡献的思路拓展到极致,就是说其实无论怎么样搞,搞完前面这套操作,还要继续操作的话,必定会增加1个代价,那么我们只要构造增加一个代价的字符串就行了。

用代码描述就是这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FOR(i,1,N){
if(S[i]=='?'){
if(chs.empty()){
if(S[i-1]>='a' && S[i-1]<='z'){
S[i]=S[i-1];
}
}else{
S[i]=chs.back();chs.pop_back();
}
}
}
ROF(i,N,1){
if(S[i]=='?'){
if(chs.empty()){
if(S[i+1]>='a' && S[i+1]<='z'){
S[i]=S[i+1];
}
}else{
S[i]=chs.back();chs.pop_back();
}
}
}

AC代码

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78079278

心路历程(WA,TLE,MLE……)