zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    (转)轻松应对IDC机房带宽突然暴涨问题
    (转)老男孩:Linux企业运维人员最常用150个命令汇总
    (转)cut命令详解
    (转)Awk使用案例总结(运维必会)
    (转)Nmap命令的29个实用范例
    BigPipe学习研究
    js正则大扫除
    ffff表单提交的那点事
    高并发订单操作处理方法
    订单号的处理
  • 原文地址:https://www.cnblogs.com/codingutopia/p/test171005.html
Copyright © 2011-2022 走看看