Power Strings POJ - 2406 后缀数组
Input
Output
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
Hint
1 #include <cstdlib>
2 #include <cstring>
3 #include <cstdio>
4 #include <algorithm>
5 using namespace std;
6 const int maxn = 3000010;
7 #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb))
8 #define G(x) ((x) < tb ? (x) * 3 + 1 : ((x) - tb) * 3 + 2)
9 int wa[maxn], wb[maxn], Ws[maxn], wv[maxn], sa[maxn];
10 int Rank[maxn], height[maxn],r[maxn];
11 char s[maxn];
12 int c0(int *r, int a, int b)
13 {
14 return r[a] == r[b] && r[a + 1] == r[b + 1] && r[a + 2] == r[b + 2];
15 }
16 int c12(int k, int *r, int a, int b)
17 {
18 if (k == 2)
19 return r[a] < r[b] || r[a] == r[b] && c12(1, r, a + 1, b + 1);
20 return r[a] < r[b] || r[a] == r[b] && wv[a + 1] < wv[b + 1];
21 }
22 void Rsort(int *r, int *a, int *b, int n, int m)
23 {
24 for (int i = 0; i < n; i++) wv[i] = r[a[i]];
25 for (int i = 0; i < m; i++) Ws[i] = 0;
26 for (int i = 0; i < n; i++) Ws[wv[i]]++;
27 for (int i = 1; i < m; i++) Ws[i] += Ws[i - 1];
28 for (int i = n - 1; i >= 0; i--) b[--Ws[wv[i]]] = a[i];
29 }
30 void dc3(int *r,int *sa,int n, int m)
31 {
32 int i, j, *rn = r + n, *san = sa + n, ta = 0, tb = (n + 1) / 3, tbc = 0, p;
33 r[n] = r[n + 1] = 0;
34 for (i = 0; i < n; i++) if (i % 3 != 0) wa[tbc++] = i;
35 Rsort(r + 2, wa, wb, tbc, m);
36 Rsort(r + 1, wb, wa, tbc, m);
37 Rsort(r, wa, wb, tbc, m);
38 for (p = 1, rn[F(wb[0])] = 0, i = 1; i < tbc; i++)
39 rn[F(wb[i])] = c0(r, wb[i - 1], wb[i]) ? p - 1 : p++;
40 if (p < tbc) dc3(rn, san, tbc, p);
41 else for (i = 0; i < tbc; i++) san[rn[i]] = i;
42 for (i = 0; i < tbc; i++) if (san[i] < tb) wb[ta++] = san[i] * 3;
43 if (n % 3 == 1) wb[ta++] = n - 1;
44 Rsort(r, wb, wa, ta, m);
45 for (i = 0; i < tbc; i++) wv[wb[i] = G(san[i])] = i;
46 for (i = 0, j = 0, p = 0; i < ta && j < tbc; p++)
47 sa[p] = c12(wb[j] % 3, r, wa[i], wb[j]) ? wa[i++] : wb[j++];
48 for (; i < ta; p++) sa[p] = wa[i++];
49 for (; j < tbc; p++) sa[p] = wb[j++];
50 }
51 void get_height(int n)
52 {
53 int i, j, k = 0;
54 for (i = 1; i <= n; i++) Rank[sa[i]] = i;
55 for (i = 0; i < n; height[Rank[i++]] = k)
56 for (k ? k-- : 0, j = sa[Rank[i] - 1]; r[i + k] == r[j + k]; k++);
57 }
58 int main()
59 {
60 while(~scanf("%s",s))
61 {
62 int n=strlen(s);
63 if(n==1 && s[0]=='.') break;
64 for(int i=0;i<n;++i)
65 r[i]=s[i];
66 r[n]='0';
67 dc3(r,sa,n+1,200);
68 get_height(n);
69 int flag=0;
70 for(int i=1;i<n;++i) //枚举循环节长度
71 {
72 if(n%i==0 && Rank[0]-Rank[i]==1 && height[Rank[0]]==n-i)
73 {
74 flag=1;
75 printf("%d\n",n/i);
76 break;
77 }
78 }
79 if(!flag)
80 printf("1\n");
81 }
82 return 0;
83 }
Da模板TLE代码:
1 #include <cstdlib>
2 #include <cstring>
3 #include <cstdio>
4 #include <algorithm>
5 using namespace std;
6
7 const int N = 1000010;
8 int x[N], y[N], c[N];
9 int rank[N], height[N];
10 int sa[N],n,k;
11 char s[N];
12 bool pan(int *x,int i,int j,int k,int n)
13 {
14 int ti=i+k<n?x[i+k]:-1;
15 int tj=j+k<n?x[j+k]:-1;
16 return x[i]==x[j]&&ti==tj;
17 }
18 void build_SA(int n,int r)
19 {
20 int *x=rank,*y=height;
21 for(int i=0; i<r; i++)c[i]=0;
22 for(int i=0; i<n; i++)c[s[i]]++;
23 for(int i=1; i<r; i++)c[i]+=c[i-1];
24 for(int i=n-1; i>=0; i--)sa[--c[s[i]]]=i;
25 r=1;
26 x[sa[0]]=0;
27 for(int i=1; i<n; i++)
28 x[sa[i]]=s[sa[i]]==s[sa[i-1]]?r-1:r++;
29 for(int k=1; r<n; k<<=1)
30 {
31 int yn=0;
32 for(int i=n-k; i<n; i++)y[yn++]=i;
33 for(int i=0; i<n; i++)
34 if(sa[i]>=k)y[yn++]=sa[i]-k;
35 for(int i=0; i<r; i++)c[i]=0;
36 for(int i=0; i<n; i++)++c[x[y[i]]];
37 for(int i=1; i<r; i++)c[i]+=c[i-1];
38 for(int i=n-1; i>=0; i--)sa[--c[x[y[i]]]]=y[i];
39 swap(x,y);
40 r=1;
41 x[sa[0]]=0;
42 for(int i=1; i<n; i++)
43 x[sa[i]]=pan(y,sa[i],sa[i-1],k,n)?r-1:r++;
44 }
45 for(int i=0; i<n; i++)rank[i]=x[i];
46 }
47 void get_height(int n)
48 {
49 int i,j,k=0;
50 for(i=1; i<=n; i++)rank[sa[i]]=i;
51 for(i=0; i<n; i++)
52 {
53 if(k)k--;
54 else k=0;
55 j=sa[rank[i]-1];
56 while(s[i+k]==s[j+k])k++;
57 height[rank[i]]=k;
58 }
59 }
60 int check(int len)
61 {
62 int i=2,cnt=0;
63 while(1)
64 {
65 while(i<=n && height[i]>=len)
66 cnt++,i++;
67 if(cnt+1>=k)return 1;
68 if(i>=n)return 0;
69 while(i <=n &&height[i]<len)
70 i++;
71 cnt=0;
72 }
73 }
74
75 int main()
76 {
77 while(~scanf("%s",s))
78 {
79 n=strlen(s);
80 if(n==1 && s[0]=='.') break;
81 s[n]='0';
82 build_SA(n+1,200);
83 get_height(n);
84 //printf("%d %d %d\n",rank[0],rank[3],height[rank[0]]);
85 int flag=0;
86 for(int i=1;i<n;++i) //枚举循环节长度
87 {
88 if(n%i==0 && rank[0]-rank[i]==1 && height[rank[0]]==n-i)
89 {
90 flag=1;
91 printf("%d\n",n/i);
92 break;
93 }
94 }
95 if(!flag)
96 printf("1\n");
97 }
98 return 0;
99 }
Power Strings POJ - 2406 后缀数组的更多相关文章
- Power Strings POJ - 2406
Power Strings POJ - 2406 时限: 3000MS 内存: 65536KB 64位IO格式: %I64d & %I64u 提交 状态 已开启划词翻译 问题描述 Gi ...
- Power Strings POJ - 2406(next水的一发 || 后缀数组)
后缀数组专题的 emm.. 就next 循环节../ 有后缀数组也可以做 从小到大枚举长度i,如果长度i的子串刚好是重复了len/i次,应该满足len % i == 0和rank[0] - rank[ ...
- ( KMP 求循环节的个数)Power Strings -- poj -- 2406
链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS Memory Limit:65536KB 64bi ...
- POJ2406 Power Strings —— KMP or 后缀数组 最小循环节
题目链接:https://vjudge.net/problem/POJ-2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Tot ...
- Power Strings (poj 2406 KMP)
Language: Default Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33205 ...
- Match:Power Strings(POJ 2406)
字符串前缀的阶 题目大意:求前缀的阶 和POJ1961是一样的,KMP的Next数组的应用,不要用STL,不要一个一个读入字符(IO永远是最慢的) #include <iostream> ...
- Power Strings - POJ 2406(求循环节)
题目大意:叙述的比较高大上,其实就是一个字符串B = AAAAAAA,求出来这个A最短有多长 分析:注意如果这个串不是完全循环的,那么循环节就是就是它本身. 代码如下: #include< ...
- poj 3693 后缀数组 重复次数最多的连续重复子串
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8669 Acc ...
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
http://poj.org/problem?id=2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submiss ...
随机推荐
- 70.LeetCode爬楼梯
爬楼梯 点击标题可跳转到官网进行查看 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: ...
- MongoDB备份(mongodump)与恢复(mongorestore)工具实践
mongodump和mongorestore实践 1.mongodump备份工具 mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档 ...
- vim 手动添加脚本头部信息
vim /root/.vimrc 8,1 全部 set autoindent set tabstop=5 set shiftwidth=4 function AddTitle() call setli ...
- Azure Key Valut 简介
Azure Key Vault(密钥库)是用于安全地存储和访问Secret的云服务,Secret是需要严格控制访问权限的内容,例如API密钥,密码,证书或加密密钥.Key Vault Service支 ...
- 鸿蒙的远程交互组件应用及微信小程序的远程交互组件应用
注:鸿蒙的远程交互组件应用相对复杂 ,访问网络时,首先要配置网络权限,华为官方文档有问题,在此引用我老师配置的模板,见附件 过程:1.导入鸿蒙的网络请求模块fetch 2.发起对服务器的请求(在这过程 ...
- 企业项目迁移go-zero全攻略(一)
作者:Mikael 最近发现 golang 社区里出了一个新兴的微服务框架.看了一下官方提供的工具真的很好用,只需要定义好 .api 文件模版代码都可以一键生成,只需要关心业务:同时 core 中的工 ...
- 好你个C语言,原来还有这么多副面孔!
C语言可以这样比喻,是一门非常强大的内功心法,学会它可以做到一法通万法.这也是它至今不衰的原因.说了这么多C语言的优点,现在来说说它的缺点.C语言最大的优点也是它最大的缺点,拥有强大的力量时应时刻保持 ...
- Django orm中related_name/related_query_name区别
related_name/related_query_name区别 class Department(models.Model): title = models.CharField(verbose_n ...
- MATLAB图像处理_Bayer图像处理 & RGB Bayer Color分析
Bayer图像处理 Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 ...
- matlab图像处理程序大集合
1.图像反转 MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8( ...