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;
}
}
原文地址:https://www.cnblogs.com/au-xiaotian/p/4617265.html