#include <iostream>
#include <stdio.h>
#include <math.h>
#include <cmath>
#include <vector>
#include <map>
#include <string>
#include <string.h>
#include <set>
#include <queue>
#include <algorithm>
#include <sstream>
#include <queue>
using namespace std;
typedef long long LL ;
int n , a , b ;
const int nodeSize = 300000 * 50 + 8 ;
std::vector<int>lable[nodeSize] ;
int _next[nodeSize][2] ;
struct Tire{
int root ;
int totel ;
int newNode(){
_next[totel][0] = _next[totel][1] = 0 ;
lable[totel].clear() ;
return totel++ ;
}
void clear(){
totel = 0 ;
root = newNode() ;
}
void add(LL x , int id){
int now = root ;
int son ;
for(int i = 0 ; i < n ; i++){
if(x & (1LL<<i)) son = 1 ;
else son = 0 ;
if(! _next[now][son])
_next[now][son] = newNode() ;
now = _next[now][son] ;
}
lable[now].push_back(id) ;
}
int find(LL x , int id){
int now = root ;
int son ;
for(int i = 0 ; i < n ; i++){
if(x & (1LL<<i)) son = 1 ;
else son = 0 ;
son ^= 1 ;
if(! _next[now][son])
return 0 ;
now = _next[now][son] ;
}
int res = 0 ;
for(std::vector<int>::iterator it = lable[now].begin() ; it != lable[now].end() ; it++){
if(id - *it >= a && id - *it <= b) res++ ;
}
return res ;
}
} ;
const int N = 300008 ;
LL sum[N] ;
char light[58] ;
Tire tree ;
int main(){
int m , ca = 1 ;
LL x ;
while(scanf("%d%d%d%d" , &n , &m , &a , &b) != EOF){
sum[0] = 0 ;
for(int i = 1 ; i <= m ; i++){
scanf("%s" , light) ;
x = 0 ;
for(int j = 0 ; j < n ; j++){
if(light[j] == '1') x |= (1LL<<j) ;
}
sum[i] = sum[i-1] ^ x ;
}
LL res = 0 ;
tree.clear() ;
tree.add(0LL , 0) ;
for(int i = 1 ; i <= m ; i++){
res += tree.find(sum[i] , i) ;
tree.add(sum[i] , i) ;
}
printf("Case %d: %lld\n" , ca++ , res) ;
}
return 0 ;
}
UVA 12937 字典树
最新推荐文章于 2024-07-23 10:15:44 发布