题意
一个农场主有 N 头牛,每个牛都以它身上的斑点数作为标志,以斑点数作为标准对牛进行 rank 排序,定义牛的序列的相同性为第 i 头牛及其之前的牛的比他 rank 小的数量和与他 rank 相同的数量,比如:
1 4 4 3 2 1 和 2 10 10 7 3 2 是一样的模式串
要求数有多少个符合要求的模式串,并输出每个符合要求的子串的起始位置。
题解
定义一个函数 $getval(ch,str,l,r)$,返回的值为 $ch$ 在 $str[l~r]$ 中的真实值,即将 $str[l~r]$ 中的值排序离散化后 $ch$ 的值。则题意即为:在a串中找出一段长为m的区间[l,r],使对任意的1≤i≤m,getval(a[l+i-1],a,l,r)均等于getval(b[i],b,1,m)getval的值,其实是返回某个数(数跟字符其实是一样的)在某堆数中的排名。是什么决定了一个数x的排名?是小于x的数的个数,等于x的数的个数。如果这两个个数与另一个y的两个个数都相等,那么x跟y在各自字符串的各自区间内的getval值就相等了
代码
1 |
|