题意:求最小循环节

\(KMP\)可以20ms通过,而\(da\)实现的后缀数组并无法在3000ms内通过

听说要用\(dc3\)才勉强卡过,这里仅列出\(da\)实现

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define iin(a) scanf("%d",&a)
#define lin(a) scanf("%lld",&a)
#define din(a) scanf("%lf",&a)
#define s0(a) scanf("%s",a)
#define s1(a) scanf("%s",a+1)
#define print(a) printf("%lld",(ll)a)
#define enter putchar('\n')
#define blank putchar(' ')
#define println(a) printf("%lld\n",(ll)a)
#define IOS ios::sync_with_stdio(0)
using namespace std;
const int maxn = 1e6+11;
const int oo = 0x3f3f3f3f;
const double eps = 1e-7;
typedef long long ll;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
char str[maxn];int n;
struct SA{
int Rank[maxn],sa[maxn],tsa[maxn],A[maxn],B[maxn];
int cntA[maxn],cntB[maxn];
int height[maxn],best[maxn][22],n;
void get(int nn){
n=nn;
rep(i,0,666) cntA[i]=0;
rep(i,1,n) cntA[str[i]]++;
rep(i,1,666) cntA[i]+=cntA[i-1];
rrep(i,n,1) sa[cntA[str[i]]--]=i;
Rank[sa[1]]=1;
rep(i,2,n){
if(str[sa[i]]==str[sa[i-1]]){
Rank[sa[i]]=Rank[sa[i-1]];
}else{
Rank[sa[i]]=1+Rank[sa[i-1]];
}
}
for(int l=1;Rank[sa[n]]<n;l<<=1){
rep(i,1,n) cntA[i]=cntB[i]=0;
rep(i,1,n) cntA[A[i]=Rank[i]]++;
rep(i,1,n) cntB[B[i]=(i+l<=n?Rank[i+l]:0)]++;
rep(i,1,n) cntA[i]+=cntA[i-1],cntB[i]+=cntB[i-1];
rrep(i,n,1) tsa[cntB[B[i]]--]=i;
rrep(i,n,1) sa[cntA[A[tsa[i]]]--]=tsa[i];
Rank[sa[1]]=1;
rep(i,2,n){
bool flag=A[sa[i]]==A[sa[i-1]]&&B[sa[i]]==B[sa[i-1]];
flag=!flag;
Rank[sa[i]]=Rank[sa[i-1]]+flag;
}
}
}
void ht(){
int j=0;
rep(i,1,n){
if(j) j--;
while(str[i+j]==str[sa[Rank[i]-1]+j]) j++;
height[Rank[i]]=j;
}
}
void rmq(){
rep(i,1,n) best[i][0]=height[i];
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
best[j][i]=min(best[j][i-1],best[j+(1<<(i-1))][i-1]);
}
}
}
int query(int l,int r){
if(l==r)return -oo;
if(l>r)swap(l,r);
l++;
int k=log(1.0*r-l+1)/log(2.0);
return min(best[l][k],best[r-(1<<k)+1][k]);
}
}sa;
int main(){
while(~s1(str)){
if(str[1]=='.'&&str[2]==0)break;
n=strlen(str+1);
sa.get(n);
sa.ht();
sa.rmq();
int ans=1;
rep(i,1,n-1){
if(n%i!=0)continue;
// if(sa.sa[i]==1) break;
// if(sa.sa[i]==sa.Rank[1]) break;
// cout<<sa.query(i,sa.Rank[1])<<endl;
// if(sa.query(i,sa.Rank[1])==n-sa.sa[i]+1){
// ans=max(ans,n/(n-sa.sa[i]));
// }
if(sa.query(sa.Rank[1],sa.Rank[1+i])==n-i){
ans=n/i;break;
}
}
println(ans);
}
return 0;
}

最新文章

  1. php在5.5.0默认提供了Zend OPcache
  2. elastalert SpikeRule异常告警问题
  3. redis geo 初探
  4. spring.net tx:advice 和 aop:config 配置事务 匹配名字的方法管理事务
  5. POJ 1625 Censored!(大数+DP)
  6. 【C51】单片机独立按键与矩阵按键
  7. hdu 5713(状态压缩DP)
  8. Maven pom.xml 配置详解
  9. chown
  10. EffectiveC#1--尽可能的使用属性(property),而不是数据成员(field)
  11. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond
  12. JavaScript DOM编程艺术-学习笔记(第十章、第十一章)
  13. 选择LDO的方法(转)
  14. 【Chrome控制台】获取元素上绑定的事件信息以及监控事件
  15. Python网络爬虫与如何爬取段子的项目实例
  16. 上海市2019年公务员录用考试第一轮首批面试名单(B类)
  17. Script to Collect Log File Sync Diagnostic Information (lfsdiag.sql) (文档 ID 1064487.1)
  18. 【ASP.NET】第一个ASP.NET MVC应用程序
  19. dos常用命令使用说明
  20. Java截取图片的一部分并保存为40*40的图片

热门文章

  1. 启动dhcp出错:No subnet declaration for eth0 (192.168.0.1
  2. ROS 不能安装 Ros Packages
  3. 9.TOP 子句--mysql limit
  4. csv、txt读写及模式介绍
  5. 在Struts2的Action中取得请求参数值的几种方法
  6. Requests接口测试(一)
  7. oracle数据库之数据插入、修改和删除
  8. MongoDB整理笔记の体系架构
  9. MVC区域路由配置
  10. $(this)在ajax里面不生效的探究