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模拟赛的主要内容,如果未能解决你的问题,请参考以下文章
当我想模拟数据并测试 UI 片段时,doNothing() 不起作用