CF-Codeforces Round #487 (Div. 2)-B-A Tide of Riverscape
描述
题解
给定一个初始包含 .01 .01 的序列,问是否存在一种替换方法,将 . . 替换做 或者 1 1 后保证不是所有的 都满足 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;
}