思路:
刚开始以为要用kmp匹配,一算复杂度发现暴力就够了STO…
假设只有一个串中只有一个“happiness”,交换’a’和’h’即可。
串中有两个“happiness”,交换第一个串’h’和第二个串的’a’。
假设有三个”happiness”,无解。
问题是没有”happiness”时,随机交换两个数可能会产生新的”happiness”,因此我队WA了8次罚时罚死Orz,正确的处理方法是把串中第一个’h’和最末尾的字符交换。同时还要注意没有’h’时只用交换任意两字符。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 200000
int n;
int a[maxn+5]= {0};
int cnt;
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
cnt+=a[i];
}
if(cnt>=n) {
printf("NO\n");
return 0;
}
int m=n;
for(int i=n; i>=1&&!a[i]; i--) m--;
if(m==0) {
printf("YES\n");
return 0;
}
vector<int> ans1,ans2;
for(int i=n; i>=1; i--) {
if(a[i]) {
printf("NO\n");
return 0;
}
if(a[m]) {
a[m]--;
} else {
m--;
if(m==0) break;
a[m]--;
}
ans1.push_back(m),ans2.push_back(i);
}
printf("YES\n");
for(int i=0; i<ans1.size(); i++) printf("%d %d\n",ans1[i],ans2[i]);
return 0;
}