https://www.cnblogs.com/widsom/p/8058358.htm  (详细解释)

//#include<bits/stdc++.h>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define ull unsigned long long
using namespace std;
const int maxn=1e6+;
char a[maxn];
ull b[maxn];
ull c[maxn];
int main()
{
b[]=; ull d=;
for(int i=;i<=maxn;i++) b[i]=b[i-]*d;
while()
{
scanf("%s",a+); int n=strlen(a+);
if(n== && a[]=='.') break;
for(int i=;i<=n;i++) c[i]=c[i-]*d+(a[i]-'a'+);
vector<int> vs; for(int i=;i<=n;i++) { if(n%i==) vs.push_back(i); }
int ans=;
for(int i=;i<vs.size();i++)
{
int flag=;
for(int j=*vs[i];j<=n;j+=vs[i])
{
ull x=c[j]-c[j-vs[i]]*b[vs[i]];
if(x!=c[vs[i]]) {flag=; }
}
if(flag) {ans=n/vs[i]; break; }
}
printf("%d\n",ans);
}
}
//#include<bits/stdc++.h>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define ull unsigned long long
using namespace std;
const int maxn=1e6+;
char ss[maxn];
int nt[maxn];
int KMP()
{
int l=strlen(ss);
nt[]=-;
for (int i = ; i < l; ++i) {
int j = nt[i-];
while(ss[j+] != ss[i] && j >= ) j = nt[j];
if(ss[j+] == ss[i]) nt[i] = j+;
else nt[i] = -;
}
for(int i=;i<l;i++)
{
cout<<nt[i]<<endl;
}
int k=l-(nt[l-]+);
if(l%k==) return l/k;
else return ;
}
int main()
{ while()
{
scanf("%s",ss); int n=strlen(ss);
if(n== &&ss[]=='.') break;
printf("%d\n",KMP());
}
}

KMP

//#include<bits/stdc++.h>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#define ull unsigned long long
using namespace std;
const int maxn=1e6+;
char ss[maxn];
int nt[maxn];
int KMP()
{
int l=strlen(ss); // ss
//int t=strlen(tt);
nt[]=-;
int num=;
for(int i=,j=-;i<l;)
{
if(j==-||ss[i]==ss[j])
{
nt[i]=j; // next[1]=
i++; j++; }
else
j=nt[j];
}
int k=l-(nt[l-]+);
if(l%k==) return l/k;
else return ;
}
int main()
{ while()
{
scanf("%s",ss); int n=strlen(ss);
if(n== &&ss[]=='.') break;
printf("%d\n",KMP());
}
}

KMP

桶排序

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define rank rk
using namespace std; typedef long long LL; const int maxn = , M = ;
// sa[1-n] -> 0->n-1;
int sa[maxn], rank[maxn], height[maxn]; int wa[maxn], wb[maxn], wv[maxn], cnt[maxn];
void SA(int *r, int n, int m) {
int *x = wa, *y = wb;
for(int i = ; i < m; i++) cnt[i] = ;
for(int i = ; i < n; i++) cnt[x[i] = r[i]]++;
for(int i = ; i < m; i++) cnt[i] += cnt[i - ];
for(int i = n - ; i >= ; i--) sa[--cnt[x[i]]] = i;
for(int j = ; j < n; j <<= ) {
int p = ;
for(int i = n - j; i < n; i++) y[p++] = i;
for(int i = ; i < n; i++) if(sa[i] >= j) y[p++] = sa[i] - j;
for(int i = ; i < n; i++) wv[i] = x[y[i]];
for(int i = ; i < m; i++) cnt[i] = ;
for(int i = ; i < n; i++) cnt[wv[i]]++;
for(int i = ; i < m; i++) cnt[i] += cnt[i - ];
for(int i = n - ; i >= ; i--) sa[--cnt[wv[i]]] = y[i];
swap(x, y);
p = ; x[sa[]] = ;
for(int i = ; i < n; i++)
x[sa[i]] = y[sa[i - ]] == y[sa[i]] && y[sa[i - ] + j] == y[sa[i] + j] ? p - : p++;
if(p >= n) break;
m = p;
}
} void calcHeight(int *r, int n) {
int i, j, k;
for(i = j = k = ; i < n; height[rank[i++]] = k)
for(k ? k-- : , j = sa[rank[i] - ]; r[i + k] == r[j + k]; k++);
} int n, s[maxn];
char str[maxn];
int lg[maxn];
int main() {
for(int i=;i<maxn;i++){lg[i]=lg[i>>]+;}
while()
{
scanf("%s", str); n = strlen(str);
if(n== && str[]=='.') break;
for(int i = ; i < n; i++) s[i] = str[i]; s[n] = ;
SA(s, n + , M);
for(int i = ; i <= n; i++) rank[sa[i]] = i;
calcHeight(s, n);
int ans = ;
for (int i = ; i <= n; ++i) {
if(n%i == ) {
if(rank[]-rank[i] == && height[rank[]] == n-i) {
ans = n/i;
break;
}
}
}
printf("%d\n",ans);
}
return ;
}

会T

DC3

- Power Strings (字符串哈希) (KMP)的更多相关文章

  1. UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)

    题意: 定义a为一个字符串,a*a表示两个字符相连,即 an+1=a*an ,也就是出现循环了.给定一个字符串,若将其表示成an,问n最大为多少? 思路: 如果完全不循环,顶多就是类似于abc1这样, ...

  2. Codeforces 109D String Transformation 字符串 哈希 KMP

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF109D.html 题目传送门 - CF109D 题意 给定两个字符串 $a,b$ ,求一组 $i,j$ 使得 ...

  3. POJ1961 Period && POJ2604 Power Strings 字符串循环节

    两道题都是求循环节的...但是一道是学哈希时做的,另一道是学$KMP$时做的 POJ2604 用的哈希...枚举长度的因数作为循环节的长度,然后暴力算出所有循环节位置的哈希值,看看是否相等. #inc ...

  4. POJ 2406 Power Strings (KMP)

    Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...

  5. UVA - 10298 Power Strings (KMP求字符串循环节)

    Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenati ...

  6. poj 2406:Power Strings(KMP算法,next[]数组的理解)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30069   Accepted: 12553 D ...

  7. 【POJ2406】 Power Strings (KMP)

    Power Strings Description Given two strings a and b we define a*b to be their concatenation. For exa ...

  8. Power Strings(kmp妙解)

    Power Strings Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tota ...

  9. Power Strings (poj 2406 KMP)

    Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33205   ...

随机推荐

  1. 下载excle文件之工具

    创建万能的工具类,已备用 ExcelData.java 存放文件数据 package com.ulic.gis.dataCenter.util; import java.io.Serializable ...

  2. xstream解析xml时遇到特殊字符出错

    在xml中有"&"符号时,解析xml出错 解决办法: 将&替换成&

  3. 浏览器端-W3School-HTML:HTML DOM Meta 对象

    ylbtech-浏览器端-W3School-HTML:HTML DOM Meta 对象 1.返回顶部 1. HTML DOM Meta 对象 Meta 对象 Meta 对象代表 HTML 的 一个 & ...

  4. OpenStack RPM Sample 解析

    目录 文章目录 目录 前言 RPM 打包环境安装 RPM 打包流程 OpenStack RPM SPEC Sample RPM 升级/回退 前言 软件功能升级,尤其是 Python 这类解析型语言的软 ...

  5. TortoiseGit 中文汉化

    TortoiseGit程序以及中文汉化包:https://tortoisegit.org/download/ TortoiseGit程序: 汉化包:

  6. AppDomain介绍

    一.建立控制台项目 二.更改Program为ADSetp 三.去掉命名空间AppDomain.CurrentDomain 四.贴代码 using System; using System.IO; us ...

  7. linux stat 命令 显示文件和文件系统状态(查看文件属性) 查看文件inode

    stat 显示文件和文件系统状态(查看文件属性)  查看文件inode详细信息 [root@MongoDB ~]# stat /etc/hosts File: ‘/etc/hosts’ Size: B ...

  8. spring boot-14.集成MyBatis

    1.如何使用注解版Mybatis? (1)引入mybatis ,druid,Mysql 的依赖,环境搭建可以参考第13篇的内容 <dependency> <groupId>or ...

  9. 小记---------Hadoop的MapReduce基础知识

    MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题 MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算. 两 ...

  10. springboot2.0和Druid整合配置数据源

    1. idea使用spring 初始化工具初始化springboot项目(要选中web) 下一步,下一步 2. 在pom.xml中,引入Druid连接池依赖: <dependency> & ...