ACM模版

描述


题解

给定一个初始包含 .01 .01 的序列,问是否存在一种替换方法,将 . . 替换做 0 或者 1 1 后保证不是所有的 1 i | s | p 都满足 s[i]=s[i+p] s [ i ] = s [ i + p ] ,不存在则输出 No N o

最开始读错题意了,以为必须所有的都不满足,所以针对下标模 p p 相等的字符进行遍历,遇见两个不是 . 的字符时,判断字符之间的距离,然后看是否存在可以满足都不相等条件的替换方案,写好之后,发现第二组数据一直都是 No N o ,然后仔细看,觉得第二组数据错了……

当然,最后证明是我自己想多了,题意读错了,把题目难度提高了,如果要求不是所有都满足,那么这个题就很简单了,具体看代码吧。

代码

#include <iostream>
#include <string>

using namespace std;

int n, p;
string s;

int main(int argc, const char * argv[])
{
    while (cin >> n >> p >> s)
    {
        int flag = 0, t = n - p;
        for (int i = 0; i < t; i++)
        {
            if (s[i] == s[i + p] && s[i] == '.')
            {
                s[i] = '0';
                s[i + p] = '1';
                flag = 1;
                break;
            }

            if (s[i] != s[i + p])
            {
                if (s[i] == '.')
                {
                    if (s[i + p] == '0')
                    {
                        s[i] = '1';
                    }
                    else
                    {
                        s[i] = '0';
                    }
                }
                else if (s[i + p] == '.')
                {
                    if (s[i] == '0')
                    {
                        s[i + p] = '1';
                    }
                    else
                    {
                        s[i + p] = '0';
                    }
                }

                flag = 1;
                break;
            }

            if (s[i] == '1')
            {
                if (s[i + p] == '.')
                {
                    flag = 1;
                    s[i + p] = '0';
                    break;
                }
            }

            else if (s[i] == '0')
            {
                if (s[i + p] == '.')
                {
                    flag = 1;
                    s[i + p] = '1';
                    break;
                }
            }
        }

        if (flag)
        {
            for (int i = 0; i < n; i++)
            {
                if (s[i] == '.')
                {
                    cout << '0';
                }
                else
                {
                    cout << s[i];
                }
            }
            putchar(10);
        }
        else
        {
            cout << "No\n";
        }
    }

    return 0;
}