17-10-05模拟赛

Posted whz2002

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于17-10-05模拟赛的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 中的 Android 片段模拟

php 在终端中模拟一点加载字符的片段

当我想模拟数据并测试 UI 片段时,doNothing() 不起作用

google-map 片段应用程序在模拟器中崩溃后打开 WebView 活动

一个函数应该返回什么可以失败?

安卓。片段 getActivity() 有时返回 null