解题:POI 2010 Beads

题面

正反各做一遍哈希来判断,然后在两个哈希值里取一个$max/min$做哈希值,然后每次把子串们的哈希插进$set$里,最后统计集合大小,就可以优秀地在$O(nlog^2$ $n)$中出解了

然后我觉得这样太没有理想了,就写了一个挂链哈希表,结果跑的贼慢。。。

我挂链时的区分方法是换模数再模出一个新值,然后这样做的时候注意要和哈希表的基数和模数区分开

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=200050,M=2500;
 6 const long long bs=1009,md=2333;
 7 const long long bas=203339,mod=2147483647;
 8 long long num[N],hah[N][2],huh[N][2],pw[N][2],val[N];
 9 int p[M],nxt[N],outp[N];
10 int n,pos,cnt,ans;
11 long long Ghash(int l,int r,int t)
12 {
13     long long mdd=t?mod:md;
14     long long h1=((hah[r][t]-hah[l-1][t]*pw[r-l+1][t])%mdd+mdd)%mdd;
15     long long h2=((huh[l][t]-huh[r+1][t]*pw[r-l+1][t])%mdd+mdd)%mdd;
16     return max(h1,h2);
17 }
18 bool Fhash(long long has,long long hsh)
19 {
20     for(int i=p[has%md];i;i=nxt[i])
21         if(val[i]==hsh) return true;
22     return false;
23 }
24 void Ihash(long long has,long long hsh)
25 {
26     if(Fhash(has,hsh)) return ;
27     nxt[++cnt]=p[pos=has%md];
28     val[cnt]=hsh,p[pos]=cnt;
29 }
30 int main ()
31 {
32     scanf("%d",&n),pw[0][0]=pw[0][1]=1;
33     for(int i=1;i<=n;i++)
34     {
35         scanf("%lld",&num[i]);
36         pw[i][0]=pw[i-1][0]*bs%md;
37         pw[i][1]=pw[i-1][1]*bas%mod;
38     }
39     for(int i=1;i<=n;i++)
40     {
41         hah[i][0]=(hah[i-1][0]*bs+num[i])%md;
42         hah[i][1]=(hah[i-1][1]*bas+num[i])%mod;
43     }
44     for(int i=n;i;i--)
45     {
46         huh[i][0]=(huh[i+1][0]*bs+num[i])%md;
47         huh[i][1]=(huh[i+1][1]*bas+num[i])%mod;
48     }
49     for(int i=1;i<=n;i++)
50     {
51         memset(p,0,sizeof p); cnt=0;
52         for(int j=1;j<=n-i+1;j+=i)
53             Ihash(Ghash(j,j+i-1,0),Ghash(j,j+i-1,1));
54         if(cnt>ans) ans=cnt,outp[outp[0]=1]=i;
55         else if(cnt==ans) outp[++outp[0]]=i;
56     }
57     printf("%d %d\n",ans,outp[0]);
58     for(int i=1;i<=outp[0];i++)
59         printf("%d ",outp[i]);
60     return 0;
61 }

原文地址:https://www.cnblogs.com/ydnhaha/p/9725259.html

时间: 2024-08-01 17:25:33

解题:POI 2010 Beads的相关文章

【POI 2010】 Antisymmetry

[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2084 [算法] manacher [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 500010 int n; char s[MAXN]; inline void Manacher() { int i,len,mx = 0,pos = 0; long long ans = 0; static char t

【POI 2010】反对称 Antisymmetry

题目: 对于一个 $0/1$ 字符串,如果将这个字符串 $0$ 和 $1$ 取反后,再将整个串反过来和原串一样,就称作「反对称」字符串.比如 $00001111$ 和 $010101$ 就是反对称的,而 $1001$ 就不是.现在给出一个长度为 $n$ 的 $0/1$ 字符串,求它有多少个子串是反对称的,注意这里相同的子串出现在不同的位置会被重复计算. $n\le 5\times 10^5$ 分析: ①显然,反对称字符串的长度一定是偶数. 因为若不是偶数,中间的那个数取反永远不会等于自己. ②若

【题解】Luogu P3509 [POI 2010] ZAB-Frog 倍增dp

单调队列处理第k远的点 倍增跳点 滚(动数组)一维空间就能开下了 注意$m≤10^{18}$的读入 code 1 #include <bits/stdc++.h> 2 using namespace std; 3 namespace gengyf{ 4 #define ll long long 5 const int maxn=1e6+10; 6 inline ll read(){ 7 ll x=0,f=1; 8 char c=getchar(); 9 while(c<'0'||c>

[转]分块

转自:https://www.cnblogs.com/Sdchr/p/7927411.html 分块 设阈值 T ,把数据划分为两类,某一类的数据具有某种优势,另外一类的数据又具有另外一种优势,就可以结合利用两种优势,达到更优秀的复杂度.序列分块1. 「TH 2517」数颜色 单点修改,区间不同数个数,强制在线.2. 「SPOJ UNTITLE1」 n <= 5e5 ,区间增加等差数列,区间最值. 区间修改.区间查询是一类经典问题,数据结构的做法通常是划分为若干个子区间,若子区间的信息能够合并,

java的poi技术读取Excel[2003-2007,2010]

这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: java的poi技术读取Excel数据到MySQL 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术 :java的jxl技术导入Excel  下面是本文的项目结构: 项目中所需要的jar文件: 所用的Excel数据(2003-2007,2010都是一

Poi 2014 解题报告( 1 - 4 ,6 )

撸了一下Poi 2014 ,看了一下网上题解不多,所以决定写一下.有的题应该是数据不强水过去了,等北京回来在写一下复杂度比较靠谱的代码 o(╯□╰)o 第一题: 题意是给定一个长度不大于1000000,只包括p和j的串,求一个最长的子串,要求子串任何一个前缀和后缀都满足p的数量不少于j的数量. 首先把p当做1,把j当做0,算出前缀和 sum[] ,原来的问题就转化为求一个最长区间 [l,r] ,使得任意的i∈[l,r],都有 sum[i] - sum[l-1] >= 0 并且 sum[r] -

转帖 java使用poi.3.10读取excel 2010

package poi; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss

java的poi技术读,写Excel[2003-2007,2010]

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

NOIp 2010 解题报告

1.   机器翻译 可以看出这是一道队列的模拟题目.按照题目要求模拟翻译过程即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int q[1010],n,m,vis[1010]; 10 11