zoukankan      html  css  js  c++  java
  • TC SRM 634div2 1000 SpecialStrings解题报告

    TC SRM 634div2 1000解题报告

    题目的大意是这样的:字符串s=u+v,s仅由0,1组成,称s是特殊的当任意的u,v组合都有u<v,按字典序大于,  
    题目要求找出比s大的下一个特殊字符串。  
    

    解题思路:一个特殊字符串应该是这样的:0......1,并且不会是只有第一位是0,那么假设最后一个0在第i位  
    那么有一个可能坏的结果就是直接把第i位替换成1,这个字符串是特殊的。现在可以把第i位替换成1,然后在i后面  
    的位置加上尽可能多的0(使得结果尽可能小),那么现在如果把第k>i位换成0其余后面的位换成1后得到的字符  
    串是特殊字符串的话就可以把第k位换成0(尽可能小),不能则换成1(增大).依次处理即可。  
    

    代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    class SpecialStrings
    {
    public static string findNext(string current)
    {
        int lastz = -1, l = current.Length;
        bool flag = false;
        string t = "111111111111111111111111111111111111111111111111111111111111111111111111111111111";
    
        for (int i = l - 1; i >= 0; i--)
            if (current[i] == '0') { lastz = i; break; }
    
        if (lastz == -1) return "";
        else
        {
            StringBuilder cur = new StringBuilder("");
            for (int i = 0; i < l; i++)
            {
                if (i == lastz && !flag)
                {
                    if (IsSpecial(cur.ToString() + "1" + current.Substring(i + 1))) { cur.Append("1"); flag = true; }
                    else return "";
                    //Console.WriteLine(cur.ToString());
                }
                else
                {
                    if (current[i] == '0')
                    {
                        string tmp = cur.ToString() + "0" + t.Substring(0, l - i - 1);
                        bool f = IsSpecial(tmp);
                       // Console.WriteLine(tmp+" "+f.ToString());
    
                        if (f) cur.Append("0");
                        else { cur.Append("1"); flag = true; }
                      //  Console.WriteLine(cur.ToString());
                    }
                    else
                    {
                        string tmp= cur.ToString() + "0" + t.Substring(0, l - i - 1);
                        bool f=IsSpecial(tmp);
                      //  Console.WriteLine(tmp+" "+f.ToString());
    
                        if (flag==true && f) { cur.Append("0"); flag = true; }
                        else cur.Append("1");
    
                        //Console.WriteLine(cur.ToString());
                    }
                }
            }
            return cur.ToString();
        }
    }
    public static bool IsSpecial(string str)
    {
        //return true;
        int l = str.Length;
        for (int i = 0; i < l - 1; i++)
        {
            string v = str.Substring(i + 1);
            int vl=v.Length;
            int j = 0;
            bool flag=false;
    
            for (j = 0; j <= i && j < vl; j++)
                if (str[j] == '1' && v[j] == '0') return false;
                else if (str[j] == '0' && v[j] == '1') { flag = true; break; }
            j--;
            if (!flag && j != i || !flag && vl - 1 == i) return false;  
        }
        return true;
    }
    }
  • 相关阅读:
    Java XML的总结(一)
    golang两个协程交替打印1-100的奇数偶数
    nat类型探测方法(排除法)
    janus-gateway 在macOS上的编译部署
    性能测试-并发和QPS
    基于etcd的Rabbitmq队列订阅负载均衡
    【python学习笔记】10.充电时刻
    【python学习笔记】9.魔法方法、属性和迭代器
    【python学习笔记】8.异常
    【python学习笔记】7.更加抽象
  • 原文地址:https://www.cnblogs.com/au-xiaotian/p/4617265.html
Copyright © 2011-2022 走看看