题目描述 长度为偶数的回文串被称为偶回文串.如果一个字符串重新排序之后能够成为一个偶回文串,则称为可回文的. 给一个字符串,求可回文的子串个数.字符串只含小写字母,单个字符串长度不超过10^5,所有数据字符串长度之和不超过2*10^6. 时间限制:3000ms   内存限制:131072kb 解题思路 由于可以重新排序,所以一个子串只要任一字母出现偶数次即可.于是将字母编号,h(c) = ±1 << (c - 'a'),第奇数次出现为正,第偶数次出现为负.于是问题转化为求某一子区间的编号和为0…
题目描述 一张n*m的地图,每个格子里面有一定数量的神奇宝贝,求一个最优位置,使得所有神奇宝贝到该位置的曼哈顿距离最小. 一共有T组数据,每组数据包含两行,第一行是n和m(1<=n,m<=2000),第二行是三个整数x,y,q,表示处于(i,j)(1<=i<=n,1<=j<=m)的神奇宝贝的数量为((x^i) + (y^j))mod q,其中1<=x,y<=2000,1<=q<=10. 输出最小的曼哈顿距离和. 解题思路 这道题与2015编程之美…
题目描述 解题思路 可以求得通项公式:an = 2n + 1,所以问题就变成等差数列求异或和,这个具体为什么对我还不能很好地解释清楚,先挖坑吧. 附:c++代码 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 typedef unsigned long long llt; 7 8 llt Cal(llt x, llt d, llt P, llt Num) 9 { 10 llt ret =…
题目描述 (1,--,n)的一个排列S,定义其对应的权值F[S]为:将S划分为若干段连续子序列,每个子序列都是上升序列,F[S]的值等于能划分出的最小段数. 求n的全排列的F[S]的和,答案mod(10^9+7). 解题思路 刚拿到题目时,我没什么思路,于是决定列举情况找找规律. 当n == 1时,F[1] = 1,结论是平凡的. 当n == 2时,全排列如下: (1,2):1个子序列 (2,1):2个子序列 可以得出F[2] = 3. 当n == 3时,考虑在n == 2的情况下插入数字3.…
题目描述 给一个长度为n(1<=n<=100000)的正整数列,分成尽量多的非空段,使得每一段的最大公约数相等.一个数的最大公约数是它本身. 解题思路 要求每一段子列的gcd相等,不妨设为d,可以知道d是所有数的最大公约数,即d=(a[1],a[2],--,a[n]).于是我们先求出d,然后从前往后扫描,记st=1,移动ed,计算d1=(a[st],--,s[ed]),直到d1==d,得到的区间[st,ed]就是一个符合题目要求的子列:记st=ed+1,重复上述操作,直至数列扫完.算法时间复杂…
题目描述 输入一个学号,判断是计算机系or软件学院or其他院系. 解题思路 水题,直接判断or除以10000都可以.不废话,直接上代码. 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 char s[20]; 9 while(scanf("%s", s) != EOF) 10 { 11 if(s[2] == '0' &&…
https://buaacoding.cn/contest-ng/index.html#/188/problems 其实这题挺简单的. 注意到答案的大小最多是22 二分,check长度是mid的不同子串有多少个,然后,如果不是1 << mid个,那么肯定是不行的. 想到了这个,我居然用了字符串hash去判,傻逼了,注意到是01串,相当于二进制. #include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false) usin…
题目描述 小T送给了小L了一串项链.为了方便,我们把项链上形态不同钻石用不同的字母表示.这样小L的项链就变成了一个字符串.小L忽然想把这串项链优美地切割一下,她想把它切割成尽量少的回文项链,啊也就是回文串.求最少的切割次数. 输入 第一行一个整数T 表示数据组数 下面T组数据,每一组数据: 只有一行,一个只有小写英文字母的字符串,字符串长度 <= 1000. 输出 对于每一组数据,输出将这个字符串能切割成最少的回文串所需切割的次数. 样例输入 Copy 2 abaacca abcd 样例输出 C…
原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j,k)\)或\(A(i,j)+B(j,l)+B(l+1,k)\),其中,第一段与第三段对称(第一段正着Hash和第三段反着Hash相同,数据水(某八位质数都不卡),单模数hash就行),第二段是一个回文子串,三段都可以是空串. 在A.B串上枚举扭动的回文串的中心mid,不难发现,以其在原串上能扩展出的…
哇哦~想不到我有生之年竟然能够做出字符串的题目ヾ(✿゚▽゚)ノ虽然这题比较裸但依然灰常开心! 首先有一个棒棒的性质:本质不同的回文串最多有 O(n) 个.首先 manacher 把它们都找出来,然后问题就变成了给定 n 个子串,求它们在原串中出现的次数.求出 height 然后二分一下即可(这个好像是SA 的基础操作?). #include <bits/stdc++.h> using namespace std; #define maxn 601550 #define CNST 22 int…