首页 > 其他分享 >P3604 美好的每一天

P3604 美好的每一天

时间:2023-12-05 09:02:56浏览次数:29  
标签:26 int 一天 while 美好 P3604 ans include bsi

题意

给定一个字符串 \(S\),每次区间查询 \(l, r\) 中有多少子区间重排可以形成回文串。

Sol

莫队板子题。

首先套路地,状压 \(26\) 个字母,然后做异或前缀和。

问题变为当前区间内有多少个 \([x, y]\) 使得 \(s[y] \oplus s[x - 1]\) 有或者没有一位是 \(1\)。

考虑如何扩展一个区间,利用异或的性质。当转移运算是异或地时候,完全可以考虑枚举答案以减少枚举地数量级。

我们考虑枚举哪一位上是 \(1\)。发现可以在 \(O(26)\) 的时间内完成扩展区间。

套上莫队板子,这道题就做完了。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
string read_() {
	string ans;
	char c = getchar();
	while (c < 'a' || c > 'z')
		c = getchar();
	while (c >= 'a' && c <= 'z') {
		ans += c;
		c = getchar();
	}
	return ans;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}

const int N = 6e4 + 5;

array <int, N> s;

namespace Cpt {

int bsi;

struct Node {

int x, y, id;
bool operator < (const Node &t) const {
	if (x / bsi != t.x / bsi) return x < t.x;
	return (x / bsi) & 1 ? y < t.y : y > t.y;
}

};

array <Node, N> qrl;
array <int, (1 << 26) + 5> cur;

int ans;

void add(int x) {
	ans += cur[s[x]];
	for (int i = 0; i < 26; i++)
		ans += cur[s[x] ^ (1 << i)];
	cur[s[x]]++;
}

void del(int x) {
	cur[s[x]]--;
	ans -= cur[s[x]];
	for (int i = 0; i < 26; i++)
		ans -= cur[s[x] ^ (1 << i)];
}

}

using Cpt::qrl; using Cpt::add; using Cpt::del;
array <int, N> ans;

int main() {
	Cpt::bsi = 332;
	int n = read(), m = read();
	string str = " " + read_();
	for (int i = 1; i <= n; i++)
		s[i] = (1 << (str[i] - 'a')) ^ s[i - 1];
	for (int i = 1; i <= m; i++) {
		qrl[i].x = read(), qrl[i].y = read();
		qrl[i].id = i;
	}
	sort(qrl.begin() + 1, qrl.begin() + 1 + m);
	/* puts("@"); */
	int l = 1, r = 0;
	for (int i = 1; i <= m; i++) {
		int x = qrl[i].x - 1, y = qrl[i].y;
		int id = qrl[i].id;
		while (l > x) l--, add(l);
		while (r < y) r++, add(r);
		while (l < x) del(l), l++;
		while (r > y) del(r), r--;
		ans[id] = Cpt::ans;
	}
	for (int i = 1; i <= m; i++)
		write(ans[i]), puts("");
	return 0;
}

标签:26,int,一天,while,美好,P3604,ans,include,bsi
From: https://www.cnblogs.com/cxqghzj/p/17876443.html

相关文章

  • phthon1第一天
    第一个小程序:print('---------------------------------来玩一个游戏吧----------------------------')temp=input('请输入代表心情的数字:')guess=int(temp)ifguess==8:print("你是猜对了!")print("你是小甲鱼的蛔虫吗?")else:print("你是猜错了......
  • 第一天入职就结束了
    第一天入职就结束了情况描述领导看到我入职报告写的红绿色色盲,便以为我分不清正常和报错的红色,拒绝让我入职。产生的原因当初做体检的时候医生草草给了几张图就判了色盲我拿到这检测结果的时候,本想跟医生说再测测的,我不是色盲,只是色弱,可是看医生很忙,想着运维岗位而已......
  • 代码随性训练营第五十一天(Python)| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳
    309.最佳买卖股票时机含冷冻期classSolution:defmaxProfit(self,prices:List[int])->int:#dp[i][0]持有股票#dp[i][1]卖出股票那一天#dp[i][2]冷冻期#dp[i][3]保持卖出股票的状态dp=[[0]*4for_inrange(......
  • 一天吃透Java并发面试八股文
    内容摘自我的学习网站:topjavaer.cn分享50道Java并发高频面试题。线程池线程池:一个管理线程的池子。为什么平时都是使用线程池创建线程,直接new一个线程不好吗?嗯,手动创建线程有两个缺点不受控风险频繁创建开销大为什么不受控?系统资源有限,每个人针对不同业务都可以手动......
  • 多种数据库获取最近一天记录的SQL整理
    多种数据库获取最近一天记录的SQL整理背景纯粹当笔记.数据库种类太多,记不住,每次都需要现查,效率实在是太低了将获取最近一天记录的SQL整理好方便后续直接his用简单总结Oracle+DM+神通的语法一样Kingbase+PG+Highgo的语法一样MySQL用的是SUB其他人都是......
  • 获取月份的最后一天
    newDate(year,month,0).getDate()//获取月份的最后一天letnow=newDate()letyear=now.getFullYear()letmonth=now.getMonth()-1functionlastMonthday(year,month){letlastDay=newDate(year,month,0)......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    LeetCode704二分查找题目链接:LeetCode704左闭右闭:视频讲解:手把手带你撕出正确的二分法思路:在循环条件中注明left<=right,即[left,right]classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1......
  • 一天之内“三个离职群都满了”;飞行出租车的时代就此开启?丨 RTE 开发者日报 Vol.94
       开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 第一天总结
    HTML第一天我们接下来是进行的网页开发网页的相关概念:什么是网页?什么是HTML?网页的形成?什么是网页:1.网站是指在因特网上根据一定的规则,使用HTML等制作的用于展示特定内容相关的网页集合。2.网页是网站中的一“页”,通常是HTML格式的文件,它要通过浏览器来阅读。网......
  • 2023-11-23-周二-又是浑浑噩噩的一天
    今日完成事项:Java基础复习,,,(没看出一个什么东西来)安卓开发(学习了一点点)今日消费:5.5+9.5+19=34感觉提不上神来,,,,也就是总想睡觉,想看手机,干活就懒惰得要命上午本来有课的,室友先走,我后走我走的时候已经很晚了可笑的是,,,当我走进教学楼,,还走错教室了本来是要......