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;
}
}