POJ - 1961 最小循环节
如果循环节存在那在前缀部分也肯定存在
如果循环节存在那至少是可以匹配的
而next是维护最大前缀的,意会意会
注意一定要先判整除,即使别的题目保证是存在循环的
特意画了一张灵魂草图帮助理解

#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;
}
int nxt[maxn];
char P[maxn];
void buildNext(){
	nxt[1]=0;
	int j=0,m=strlen(P+1);
	rep(i,2,m){
		while(j&&P[i]!=P[j+1])j=nxt[j];
		if(P[i]==P[j+1])j++;
		nxt[i]=j;
	}
}
int main(){
	int m,kase=0;
	while(~iin(m)){
		if(m==0)break;
		s1(P);
		buildNext();
		printf("Test case #%d\n",++kase);
		rep(i,2,m){
			if(i%(i-nxt[i])==0&&i/(i-nxt[i])>1){
				print(i); blank;
				println((i/(i-nxt[i])));
			}
		}
		putchar('\n');
	}
	return 0;
}
POJ - 1961 最小循环节的更多相关文章
- POJ 2406 Power Strings(字符串的最小循环节)
		题目链接:http://poj.org/problem?id=2406 题意:确定字符串最多是多少个相同的字串重复连接而成的 思路:关键是找到字符串的最小循环节 code: #include < ... 
- POJ 2185 Milking Grid(KMP最小循环节)
		http://poj.org/problem?id=2185 题意: 给出一个r行c列的字符矩阵,求最小的覆盖矩阵可以将原矩阵覆盖,覆盖矩阵不必全用完. 思路: 我对于字符串的最小循环节是这么理解的: ... 
- [poj 2185] Milking Grid 解题报告(KMP+最小循环节)
		题目链接:http://poj.org/problem?id=2185 题目: Description Every morning when they are milked, the Farmer J ... 
- poj 2185 Milking Grid(next数组求最小循环节)
		题意:求最小的循环矩形 思路:分别求出行.列的最小循环节,乘积即可. #include<iostream> #include<stdio.h> #include<stri ... 
- poj1961 Period kmp解决找字符串的最小循环节
		/** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个 ... 
- KMP模板,最小循环节
		(可以转载,但请注明出处!) 下面是有关学习KMP的参考网站 http://blog.csdn.net/yaochunnian/article/details/7059486 http://blog. ... 
- UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)
		题意: 定义a为一个字符串,a*a表示两个字符相连,即 an+1=a*an ,也就是出现循环了.给定一个字符串,若将其表示成an,问n最大为多少? 思路: 如果完全不循环,顶多就是类似于abc1这样, ... 
- poj2406--Power Strings(KMP求最小循环节)
		Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33178 Accepted: 13792 D ... 
- The Minimum Length - HUST 1010(求最小循环节)
		题意:有个一字符串A(本身不是循环串),然后经过很多次自增变成AAAAA,然后呢从自增串里面切出来一部分串B,用这个串B求出来A的长度. 分析:其实就是求最小循环节.......串的长度 - 最大 ... 
随机推荐
- win32多线程(三)  死锁
			任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁. void SwapLists(List *list1, List *list2) { List *tmp_list; EnterCrit ... 
- Luogu 4198 楼房重建
			BZOJ 2957 挺妙的题. 先把题目中的要求转化为斜率,一个点$(x, y)$可以看成$\frac{y}{x}$,这样子我们要求的就变成了一个区间内一定包含第一个值的最长上升序列. 然后把这个序列 ... 
- 安装vmtools Error: Unable to execute "/usr/bin/vmware-uninstall-tools.pl.
			Error: Unable to execute "/usr/bin/vmware-uninstall-tools.pl. 安装vmware tools错误解决办法 很多朋友都在用vmwar ... 
- Linq 左连接 left join
			Suppose you have a tblRoom and tblUserInfo. Now, you need to select all the rooms regardless of whet ... 
- 很棒的git和python学习网站
			很棒的git和python学习网站:http://www.liaoxuefeng.com/ 博主名叫廖雪峰 
- Android Tablayout属性介绍
			1.添加依赖 compile 'com.android.support:design:26.0.0-alpha1' 2.属性 改变选中字体的颜色app:tabSelectedTextColor=&qu ... 
- vee-validate表单校验的基本使用
			今天主要记录一下用vee-validate来进行表单校验的几个基本使用.包括最基础的必填和长度校验:异步请求服务的校验(重名校验),还有延迟校验.如何引入等就不在这里赘述了,直接进入主题. 1.必填和 ... 
- 微信Token验证
			/// <summary> /// 微信验证 /// </summary> /// <param name="echostr"></par ... 
- Android Camera相机功能实现 拍照并保存图片
			AndroidManifest.xml <uses-feature android:name="android.hardware.camera"/> <uses- ... 
- OO  面向对象的三大特性
			面向对象的三大特性 一.面向对象特性——封装: 概念:把对象所能操作的信息进行封装: 封装作用: 1.减少代码之间的耦合: 2.提供统一的访问接口,内部修改不影响外部的调用:(开放封闭原则) 二.面向 ... 
