17-10-05模拟赛

T1:考虑数据合法性与美丽串的定义,可知其要求每个字符与其前两个字符不同。

考虑从后往前贪心,找该字母后第一个可以替换的字母,若未找到则向前查找,对于替换字母后的字母贪心构造。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MN 100005
 5 using namespace std;
 6 inline int in(){
 7     int x=0;bool f=0; char c;
 8     for (;(c=getchar())<'0'||c>'9';f=c=='-');
 9     for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0');
10     return f?-x:x;
11 }
12 char ch[MN],s[MN];
13 int n,p,pos,ps;
14 bool vis[30];
15 inline int dfs(int x){
16     if (x<0) return -2;
17     for (int i=0;i<p;++i) vis[i]=0;
18     for (int i=1;i<=2;++i) if (x-i>=0) vis[s[x-i]-'a']=1;    
19     for (int i=(s[x]-'a'+1);i<p;++i) if (!vis[i]) {pos=x;ch[x]=i+'a';break;}
20     return pos==-1?dfs(x-1):pos;
21 }
22 int main()
23 {
24     n=in();p=in();pos=-1;
25     scanf("%s",s);ps=dfs(n-1);
26     if (ps==-2) {printf("NO");return 0;}
27     for (int i=0;i<ps;++i) ch[i]=s[i];
28     for (int j=ps+1;j<n;++j){
29         for (int i=0;i<p;++i) vis[i]=0;
30         for (int i=1;i<=2;++i) if (j-i>=0) vis[ch[j-i]-'a']=1;
31         for (int i=0;i<p;++i) if (!vis[i]) {ch[j]=i+'a';break;}
32         if (!ch[j]) {printf("NO");return 0;}
33     }printf("%s",ch);return 0;
34 }
原文地址:https://www.cnblogs.com/codingutopia/p/test171005.html