zoukankan      html  css  js  c++  java
  • P3604 美好的每一天

    真·美好的每一天(美好个鬼啊)
    真·调了一下午
    原因是,我之前移动指针时没有先扩再缩,所以导致区间是负的;但是正常来说也没事,可是这题卡常,桶我开的是 unsigned short ,于是区间是负的,自然桶中会有负数,负数爆成正的爽(雾)。
    显然一段区间是回文的当且仅当至多有一个字母出现奇数次,于是我们尝试用异或去解这道题。
    我们还是类似前缀异或的思路来取出区间异或值,并枚举多出来的字母是哪个即可(这样会T)。
    于是我们可以在最开始预处理出有用的状态,就是满足 (a[i] igoplus (1<<i)) 是存在的状态存起来即可。(其实跑满好像是一样的)

    比较暴力的写法。
    inline void add(int x) {
    	anss+=c[a[x]]++;
    	for(R i=0;i<L;++i) 
    		anss+=c[a[x]^(1<<i)];
    }
    inline void sub(int x) {
    	anss-=--c[a[x]];
    	for(R i=0;i<L;++i) 
    		anss-=c[a[x]^(1<<i)];
    }
    
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<bitset>
    #define R register int
    using namespace std;
    namespace Luitaryi {
    inline int g() { R x=0,f=1;
    	register char s; while(!isdigit(s=getchar())) f=s=='-'?-1:f;
    	do x=x*10+(s^48); while(isdigit(s=getchar())); return x*f;
    } const int N=60001,M=(1<<26)+1,L=26;
    #define u16 unsigned short
    struct node { int l,r,id,pos;
    	inline bool operator < (const node& that) const 
    		{return pos==that.pos?pos&1?r<that.r:r>that.r:l<that.l;}
    }q[N];
    int n,m,B,a[N];
    int anss,ans[N],d[N][L];
    bitset<M> tg;
    char s[N],cnt[N]; u16 c[M];
    inline void add(int x) {
    	anss+=c[a[x]]++;
    	for(R i=0;i<cnt[x];++i) 
    		anss+=c[d[x][i]];
    }
    inline void sub(int x) {
    	anss-=--c[a[x]];
    	for(R i=0;i<cnt[x];++i) 
    		anss-=c[d[x][i]];
    }
    inline void main() {
    	n=g(),m=g(),scanf("%s",s+1);
    	B=sqrt(n+1); tg[0]=1;
    	for(R i=1;i<=n;++i) tg[(a[i]=a[i-1]^(1<<(s[i]-'a')))]=1;
    	for(R i=0;i<=n;++i) for(R j=0,t=1;j<L;++j,t<<=1) 
    		if(tg[a[i]^t]) d[i][cnt[i]++]=a[i]^t;
    	for(R i=1;i<=m;++i) 
    		q[i].l=g()-1,q[i].r=g(),q[i].id=i,
    		q[i].pos=q[i].l/B;
    	sort(q+1,q+m+1); 
    	for(R i=1,l=1,r=0;i<=m;++i) {
    		while(l>q[i].l) add(--l); while(r<q[i].r) add(++r);
    		while(l<q[i].l) sub(l++); while(r>q[i].r) sub(r--);
    		ans[q[i].id]=anss;
    	} 
    	for(R i=1;i<=m;++i) printf("%d
    ",ans[i]);
    }
    } signed main() {Luitaryi::main(); return 0;}
    

    2019.11.25

  • 相关阅读:
    VMware Workstation网卡不启动
    解决IE10以下对象不支持“bind”属性或方法
    二分法查找
    选择排序与冒泡排序
    方法内部开启线程的方法
    重写Collections实现自定义排序
    根据反射生成SQL语句
    vue插件安装备忘
    vue cli4.x 新建项目 过程提醒
    php setcooike()失败的原因之一,希望能帮到你
  • 原文地址:https://www.cnblogs.com/Jackpei/p/11930026.html
Copyright © 2011-2022 走看看