KMP学了3遍了......
这题就是kmp匹配过程中用树状数组维护每个数字出现的次数,快速查询在前面比自己小的和等于自己的来判断是否能向后匹配
原题USACO 2005 December cpattern
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define lowbit(x) (x & -x)
#define L 500001
#define N 10001
int n, k, s;
int a[L], b[L], p[L], equ[L], les[L], ans[L], tot;
char c;
int T[N];
inline void add(int x, int d)
{
for (int i = x;i <= s;i += lowbit(i))
T[i] += d;
}
inline int ask(int x)
{
if (!x)return x;
int res(0);
for (int i = x;i > 0;i -= lowbit(i))
res += T[i];
return res;
}
inline void kmp()
{
int i, j = 0, m;
memset(T, 0, sizeof T);
for (i = 1;i <= n; ++i)
{
add(a[i], 1);
while (j && (ask(a[i]) != equ[j+1] || ask(a[i]-1) != les[j+1]))
{
for (m = i-j;m < i-p[j]; ++m)add(a[m], -1);
j = p[j];
}
if (j =