SP263 PERIOD - Period KMP技巧
\(\color{#0066ff}{题目描述}\)
如果一个字符串S是由一个字符串T重复K次形成的,则称T是S的循环元。使K最大的字符串T称为S的最小循环元,此时的K称为最大循环次数。
现给一个给定长度为N的字符串S,对S的每一个前缀S[1~i],如果它的最大循环次数大于1,则输出该前缀的最小循环元长度和最大循环次数。
\(\color{#0066ff}{输入格式}\)
第一行一个T,T组数据\(T \leq 10\)
每组数据一个n,\(n\leq 1000000\),表示字符串长度
接下来是字符串
\(\color{#0066ff}{输出格式}\)
每组数据输出前缀长度以及最大循环次数
\(\color{#0066ff}{输入样例}\)
2
3
aaa
12
aabaabaabaab
\(\color{#0066ff}{输出样例}\)
Test case #1
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4
\(\color{#0066ff}{题解}\)
kmp的nxt数组为后缀与前缀相同的最长长度(可重叠!!)
因此,如果当前前缀合法,那么i-nxt[i]一定是最小循环长度,所以i/(i-nxt[i])就是次数喽
#include<cstdio>
#include<queue>
#include<vector>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cmath>
#define _ 0
#define LL long long
#define Space putchar(' ')
#define Enter putchar('\n')
#define fuu(x,y,z) for(int x=(y),x##end=z;x<=x##end;x++)
#define fu(x,y,z) for(int x=(y),x##end=z;x<x##end;x++)
#define fdd(x,y,z) for(int x=(y),x##end=z;x>=x##end;x--)
#define fd(x,y,z) for(int x=(y),x##end=z;x>x##end;x--)
#define mem(x,y) memset(x,y,sizeof(x))
#ifndef olinr
inline char getc()
{
static char buf[100001],*p1=buf,*p2=buf;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100001,stdin),p1==p2)? EOF:*p1++;
}
#else
#define getc() getchar()
#endif
template<typename T>inline void in(T &x)
{
int f=1; char ch; x=0;
while(!isdigit(ch=getc()))(ch=='-')&&(f=-f);
while(isdigit(ch)) x=x*10+(ch^48),ch=getc();
x*=f;
}
int n,m;
struct node
{
int to;
node *nxt;
};
typedef node* nod;
nod head[1500];
int to[1500];
bool vis[1500];
int tot;
int ans[1060];
inline void add(int from,int to)
{
nod t=new node;
t->to=to;
t->nxt=head[from];
head[from]=t;
}
inline bool find(int x)
{
for(nod i=head[x];i;i=i->nxt)
{
if(!vis[i->to])
{
vis[i->to]=true;
if((!(~to[i->to]))||find(to[i->to]))
{
to[i->to]=x;
return 1;
}
}
}
return 0;
}
int main()
{
in(n),in(m);
int x,y;
fuu(i,0,m-1) in(x),in(y),add(i,x),add(i,y),ans[i]=-1;
fuu(i,0,std::max(n,m)-1) to[i]=-1;
fuu(i,0,m-1)
{
mem(vis,0);
if(find(i)) tot++;
else break;
}
printf("%d\n",tot);
fuu(i,0,n-1) if(~to[i]) ans[to[i]]=i;
fuu(i,0,m-1) if(~ans[i]) printf("%d\n",ans[i]);
return ~~(0^_^0);
}
SP263 PERIOD - Period KMP技巧的更多相关文章
- 【题解】PERIOD - Period [POJ1961] [SP263]
[题解]PERIOD - Period [POJ1961] [SP263] 在进入这道题之前,我们需要了解 kmp 算法 不知道的童鞋可以去看一下Silent_EAG(一个可爱的女孩纸)的讲解. 关于 ...
- Period(kmp)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- FZU - 1901 Period II(kmp所有循环节)
Problem Description For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SI ...
- poj1961 & hdu1358 Period【KMP】
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 20436 Accepted: 9961 Descripti ...
- hdu 1358:Period(KMP算法,next[]数组的使用)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Period :KMP
I - Period Problem Description For each prefix of a given string S with N characters (each character ...
- HDU 1358 Period(kmp简单解决)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU - 1358 - Period (KMP)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- Fzu Problem 1901 Period II (kmp)
题目链接: Problem 1901 Period II 题目描述: 给出一个串,满足长度为p的前缀和长度为p的后缀相等的p的个数,输出p的个数,和p分别是多少? 解题思路: 对kmp的next数组的 ...
随机推荐
- Sass、Less和Stylus
1.背景介绍 1.Sass背景介绍 Sass是对CSS(层叠样式表)的语法的一种扩充,诞生于2007年,最早也是最成熟的一款CSS预处理器语言,它可以使用变量.常量.嵌套.混 入.函数等功能,可以更有 ...
- Python数据库(二)-Mysql数据库插入数据
通过python连接mysql数据库,并插入数据 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import pymysql ...
- 读取XML文件的指定节点的值 并转换为Item
cmb_State_Send.ItemsSource = null; XmlDocument doc = new XmlDocument(); doc.Load("D:\\模板\\Works ...
- oracle 远程tns配置
BYRUIY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = rui-oracle11g)(PORT = )) (CONNECT_DATA = ...
- Solaris11修改主机名
在Solaris10中,主机名的修改是通过修改相关的配置文件实现的.在Solaris11中,主机名的配置信息已经转移到SMF配置库中,因此修改主机名的方式与Solaris10完全不同.以下是修改Sol ...
- 11-28 网页基础--JavaScript(DOM)
网页基础 第二部分--HTMLDOM操作 一.定义:htmlDOM是一种面向对象的树的模型,它包含html中的所有元素:通过html可以找到所有包含在dom中的元素. 二.作用: 1.查找html元素 ...
- Latex 多个参考文献的引用
如果在文章中出现连续引用多个参考文献的情况,希望显示的格式为 [1-5,9,12],那么可以如下处理: 在文章的导言区加 \usepackage[square, comma, sort&com ...
- windows系统中启动应用需要的端口被别的程序占用
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- .each循环的两种使用方法
- css知多少(3)——样式来源与层叠规则(转)
css知多少(3)——样式来源与层叠规则 上一节<css知多少(2)——学习css的思路>有几个人留言表示思路很好.继续期待,而且收到了9个赞,我还是比较欣慰的.没看过的朋友建议先去看 ...