码迷,mamicode.com
首页 > 其他好文 > 详细

17-10-05模拟赛

时间:2017-10-08 13:37:24      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:ace   amp   span   line   logs   can   printf   div   string   

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 }

 

17-10-05模拟赛

标签:ace   amp   span   line   logs   can   printf   div   string   

原文地址:http://www.cnblogs.com/codingutopia/p/test171005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!