BZOJ 1355 & KMP

BZOJ放这种丝帛我也是醉了...

  不过来填一下求最小循环节的坑...

  以这道题为例,相同文本串粘起来的串中取一小节,可以把任意一个字符看做文本串头.

  那么我们一次KMP求出next函数然后显见,最后一个字符它会与上一个循环串的尾匹配,所以减一减就好啦...

/*==========================================================================
# Last modified: 2016-03-03 11:11
# Filename: 1355.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> 

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> 

#define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] 

#define maxn 100000
#define maxm 100000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 

template<class T> inline
void read(T& num) {
    bool start=false,neg=false;
    char c;
    num=0;
    while((c=getchar())!=EOF) {
        if(c==‘-‘) start=neg=true;
        else if(c>=‘0‘ && c<=‘9‘) {
            start=true;
            num=num*10+c-‘0‘;
        } else if(start) break;
    }
    if(neg) num=-num;
}
/*==================split line==================*/
char s[maxn];
int p[maxn],len=0;
void getfail(){
	int j=0; p[1]=0;
	FORP(i,2,len){
		while (j && s[i]!=s[j+1]) j=p[j];
		if (s[i]==s[j+1]) j++;
		p[i]=j;
	}
}
int main(){
	int n; read(n);// getchar();
	char c;
	while ((c=getchar())!=‘\n‘)	s[++len]=c;
	getfail();
	printf("%d",len-p[len]);
}
时间: 2024-10-12 21:33:49

BZOJ 1355 & KMP的相关文章

BZOJ 1355: [Baltic2009]Radio Transmission( kmp )

自己YY一下可以发现answer =  n - fail[ n ] ----------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i

BZOJ 1355 Baltic2009 Radio Transmission KMP算法

题目大意:给定一个字符串,求最小循环节(可以不整除) 样例的Hint是错的无视掉就好 循环节应该是cab 这题利用了KMP中next数组的性质,也就是n-next[n]表示循环节 POJ的题都要求整除,这题不用整除,直接输出n-next[n]即可 注意next数组不要开成char~ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 10010

bzoj 1355: [Baltic2009]Radio Transmission【kmp】

kmp复健,答案是n-next[n] #include<iostream> #include<cstdio> using namespace std; const int N=1000005; int n,ne[N]; char s[N]; int main() { scanf("%d%s",&n,s+1); int j=0; for(int i=2;i<=n;i++) { while(s[j+1]!=s[i]&&j) j=ne[j

BZOJ 3670 &amp;&amp; BZOJ 3620 &amp;&amp; BZOJ 3942 KMP

最近感到KMP不会啊,以前都是背板的现在要理解了. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 const int Maxn=16000; 7 8 char S[Maxn]; 9 int k,P[Maxn],Ans; 10 11 12 inline void Kmp(char * S

[bzoj 1355][Baltic2009]Radio Transmission

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1355 [Baltic2009]Radio Transmission Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 912  Solved: 626[Submit][Status][Discuss] Description 给你一个字符串,它是由某个字符串不断自我连接形成的. 但是这个字符串是不确定的,现在只想知道它的最短长度是多少. Inpu

[Strings]一些字符串题目

Trie BZOJ 3689 异或之 大意: 给定n个数,求这n个数两两异或的值中的前k小 解: 将加法换成异或就变成了一个用堆合并多个有序表的经典问题,对于加法我们按大小排序就能得到有序表,而由于这里是异或,我们需要高效地维护有序表,即对于一个数ai快速求出与它异或第k小的数. 我们将所有数按二进制建成Trie,然后在Trie的结点上记录下子树中的结束结点个数,再在Trie树上走一遍就得到了答案 BZOJ 3439 Kpm的MC密码 大意: 给定n个字符串,对于每个字符串求以这个字符串为后缀的

一句话题解(持续更新中)

8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP 逆拓扑序(贪心常用手段防止现在过度影响未来)lim边界问题曾WA多次 bzoj 1012 树状数组(线段树)第二 暴力更新后缀第一(明显可卡) 暴力查询要TLE 单调栈没调出来 //bzoj 1010 toys玩具装箱 单调性 //bzoj 1006 弦图染色裸题 诱导子图.完全图.团.最小染色.最

[BZOJ 3620] 似乎在梦中见过的样子 【KMP】

题目链接:BZOJ - 3620 题目分析 这道题使用 KMP 做 O(n^2) 的暴力就能过. 首先,我们依次枚举字串左端点 l ,然后从这个左端点开始向后做一次 KMP. 然后我们枚举右端点 r ,符合条件的右端点 r 就是 S[l..r] 这一段的一个前缀和后缀相同,并且这一部分的长度 x 要满足 k <= x < (r - l + 1) / 2. 我们就使用 KMP 的 Next 数组来找这个前缀,直接从 Next[r] 向前找最坏情况会导致变成 O(n^3) ,所以我们应该优化一下:

题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai& lt;=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0 分析: 吐槽:这道题的细节问题差点坑死我. 一开始这道题想了个DP,但是状态转移太恶心. 那我们换一个思路,先用KMP构造出A的一个自动机. 然后这道题就转化成了在自动机上跑啊跑,跑N条边都没跑