首页 > 其他分享 >美丽区间

美丽区间

时间:2024-03-18 15:01:04浏览次数:22  
标签:1000010 int sum1 美丽 区间 jc now mod

题目链接

戳这

Solution

因为n很小所以可以 n方枚举左右端点,然后实际上就是判断前面一半将69交换后是否是个 回文且这个 回文不存在反转后没意义的数,对于那几个翻转后没意义的数字随便用字母代替即可,对于前缀和后缀分别哈希然后判断是否相等即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7,base=233;
string s;
string s1;
int sum[1000010];
int sum1[1000010];
int js[1001];
int bj[1000010];
int jc[1000010];
int check1(int x,int now){
	return (sum[x+now]-sum[now]*jc[x]%mod+mod)%mod;
}
int check2(int x,int now){
	return (sum1[now-x+1]-sum1[now+1]*jc[x]%mod+mod)%mod;
}
signed main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s,s1+=s;
		js[i]=js[i-1]+s.size();
	}
    jc[0]=1;
	for(int i=1;i<=s1.size();i++)
		jc[i]=jc[i-1]*base%mod;
	for(int i=1;i<=s1.size();i++){
		if(s1[i-1]=='6') sum[i]=(sum[i-1]*base%mod+9)%mod;
		else if(s1[i-1]=='9') sum[i]=(sum[i-1]*base%mod+6)%mod;
		else if(s1[i-1]=='1'||s1[i-1]=='8'||s1[i-1]=='0') sum[i]=(sum[i-1]*base%mod+s1[i-1]-'0')%mod;
		else sum[i]=(sum[i-1]*base%mod+10)%mod;
	}
	for(int i=s1.size();i>=1;i--) sum1[i]=(sum1[i+1]*base%mod+s1[i-1]-'0')%mod;
	int maxx=0;
	for(int i=1;i<=n;i++)
		for(int j=i;j<=n;j++){
			int ans=js[j]-js[i-1];
			ans=(ans+1)/2;
			if(check1(ans,js[i-1])==check2(ans,js[j])) 
				maxx=max(j-i+1,maxx);
		}
	cout<<maxx;
}

标签:1000010,int,sum1,美丽,区间,jc,now,mod
From: https://www.cnblogs.com/hbxblog/p/18080425

相关文章

  • leedcode-汇总区间
    自己写的:classSolution:defsummaryRanges(self,nums):my_li=[]#创建一个空列表用于存储结果ifnotnums:#如果输入列表为空returnmy_li#返回空列表iflen(nums)==1:#如果输入列表只有一个元素my......
  • Github高级搜索【指定日期区间,星星数,用户仓库名多条件精确搜索】
    小伙伴们号,欢迎关注,一起学习,无限进步GitHub高级搜索允许用户使用多种条件来精确查找所需的仓库、文件和代码。以下是对GitHub高级搜索的最全、详细总结说明:文章目录关键字搜索仓库名搜索用户搜索组织搜索文件搜索语言搜索星星数搜索更新时间搜索授权搜索组合搜索排......
  • abc343F 区间第2大的出现次数
    给定数组a[n],有Q组操作,格式为:1px,将a[p]修改为x;2lr,查询区间[l,r]内第2大元素的出现次数。1<=n,q<=2e5;1<=a[i]<=1e9用线段树维护各个区间的最大及次大元素的出现次数,合并时最多只保留两条记录。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#......
  • 435. 无重叠区间c
    typedefstructnode{intleft;intright;}bounds;intcmp(constvoid*a,constvoid*b){bounds*x=(bounds*)a;bounds*y=(bounds*)b;if(x->right>y->right)return1;return-1;}interaseOverlapIntervals(int**interva......
  • lc795 区间子数组个数
    给定数组nums[n]和两个整数left,right,找出nums中连续非空、并且最大元素在[left,right]范围内的子数组,统计所有满足条件子数组的个数。1<=n<=1e5;0<=nums[i]<=1e9;0<=left<=right<=1e9;保证答案在int内枚举每个元素作为最大元素的情况,统计对应的子数组数量,如果arr[i]在允许范......
  • P3374 【模板】树状数组 动态求连续区间和 刷题笔记
    我们创建如下的树状数组来辅助操作该数组每个s[i]处于第几层取决于其二进制最后低位的1处于从右往左数第几列显然所有奇数的最右边一位都是1即其最低位的1处于右边第一列所以所有的奇数处于第一层而2,6,10,14的最低位1处于右边第二列 所以这些数处于第二层 8的最......
  • lc327 区间和的个数
    给定数组nums[n]和整数lower与upper,求nums[n]中,元素之和在[lower,upper]范围内的子数组个数。1<=n<=1e5;nums[i]在int范围内;-1e5<=lower<=upper<=1e5;答案在int范围内子数组的和可以用前缀和来快速求出,假设当前位置对应的前缀和为y,前面某处对应的前缀和为x,满足lower<=y-x<=u......
  • C++ | 蓝桥题库区间或(位运算)
    一开始看题解很晕,这里采用前缀和方式的思想是:按位贡献,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。(1<<w)1左移w位相当于2的w次方,prefix[w][r]-prefix[w][l-1]相当于[l,r]这段距离上有1就让ans加上1,没有就不加。#inc......
  • 蓝桥练习题-K倍区间
    16.k倍区间-蓝桥云课(lanqiao.cn)首先,看到这个题,想到暴力求解,但显然,数据过大,暴力法过不了;然后看到了一个办法:对所有元素的前缀和取K的模,若s[i],s[j]相同,则在j-1到i的区间内,区间和为K的倍数。C++代码:#include<iostream>#include<queue>usingnamespacestd;ty......
  • 2024/3/11打卡管道(14届蓝桥杯省赛)——二分+区间合并
    目录题目思路代码题目有一根长度为 len的横向的管道,该管道按照单位长度分为 len 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的,位于 Li 的阀门会在  时刻打开,并不断让水流入管道。对于位于  的阀门,它流入的水在 时刻会使得......