题目大意:给出一个01字符串,表示天气情况,0表示下雨,1表示天晴,要你预测未来l天的天气情况
预测规则是,比如给了n个字符串,后t天,s[n-t + 1] ~~~s[n]的天气情况和s[k-t+1] ~~~s[k]一样,k < n,那么s[n+1] = s[k+1],t从13开始,13没找到找后12天,没找到找11天的,一直找到后1天的都没找到匹配的,那么s[n+1]则为0,当出钱多个k时,取最右边的,即k最大的来匹配,后面的n+2的确定按相同原理在1~~~n+1的字符串里来预测,依次类推
解题思路:逆向kmp,从最后一个n往前做kmp
写的时候容易出错的地方是先判断匹配的字符串是否超出了13~~
然后再来看求那个最大的k
代码实现:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int const maxn = 1010000;
int next[maxn], n, l, len, end;
char str[maxn];
int main()
{
scanf("%d %d", &n, &l);
scanf("%s", str + 1);
end = n + l;
while(n <= end)
{
int i = n, j = n + 1, x = n, y, len = -1;
next[n] = n + 1;
while(i > 0)
{
if(j == n + 1 || str[i] == str[j])
{
i--; j--;
next[i] = j;
if(n - next[i] > 13)
break;
int t = n - next[i] - 1;
if(t > len)
{
len = t;
x = j; // x = next[i]
y = i;
}
}
else
j = next[j];
}
int index = y + n - x + 1;
if(x == n)
str[++n] = '0';
else
str[++n] = str[index];
}
str[end + 1] = '\0';
printf("%s\n", str + n - l);
return 0;
}