首页 > 其他分享 >PERIOD - Period(kmp求border)

PERIOD - Period(kmp求border)

时间:2024-09-14 10:15:28浏览次数:10  
标签:typedef return int PERIOD long vector kmp vx border

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
vector<int> vx;
inline int mp(int x) {return upper_bound(vx.begin(),vx.end(),x)-vx.begin();}
inline int log_2(int x) {return 31-__builtin_clz(x);}
inline int popcount(int x) {return __builtin_popcount(x);}
inline int lowbit(int x) {return x&-x;}
const int N = 1000010;
char p[N];
int ne[N];
void solve()
{
	//谷子评测出了点问题,用acwing做的,读入上稍有修改
	int n;
	int cnt = 0;
	while(cin>>n,n)
	{
		cnt++;
		scanf("%s",p+1);
		cout<<"Test case #"<<cnt<<'\n';
		ne[1] = 0;
		for(int i=2,j=0;i<=n;++i)//此处p的子匹配需要错位开始i=2
	    {
	        while(j&&p[j+1]!=p[i]) j=ne[j];//j+1是上一次循环的j,i会自增
	        if(p[i]==p[j+1]) j++;//如果匹配成功j增加1
	        ne[i]=j;
	    }
	    for(int i=2;i<=n;++i)
	    {
	    	if(ne[i]) 
	    	{
	    		int T = i-ne[i];
	    		//T是周期但不一定是循环元
	    		if(i%T==0&&i/T>1)
	    		{
	    			cout<<i<<' '<<i/T<<'\n';
	    		}
	    	}
	    }
	    cout<<'\n';
    }
}
int main()
{
	solve();
}

标签:typedef,return,int,PERIOD,long,vector,kmp,vx,border
From: https://www.cnblogs.com/ruoye123456/p/18413415

相关文章

  • 从kmp到AC自动机
    知道kmp的请跳过这一段找到最清晰的解析kmp我看了约114514个解析才搞懂如何求next首先,next[i]本应表示0~i的字符串的最长相同前缀后缀的长度。不过为了方便匹配,实际可以存最长相同前缀后缀时前缀最后一个的地址听起来好绕那这么说吧:例如串abaabaabaabnext[0]=-1肯定找......
  • KMP
    KMPKMP-字符串匹配算法,pat模式串,长度为M;txt文本串,长度为N。KMP算法是在txt中查找子串pat,如果存在,返回起始索引,否则返回-1。https://zhuanlan.zhihu.com/p/83334559这个知乎专栏讲得很好根据上面的理解1、如果是暴力枚举的话,就是在txt枚举每一个字符,当这个字符与pat开头相......
  • 代码随想录算法训练营第九天 | Javascript | 力扣Leetcode | 手撕KMP的一天 | 28. 找
    目录前言简介题目链接:28.找出字符串中第一个匹配项的下标题目链接:459.重复的子字符串前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄弱。......
  • KMP 算法
    \(Question:\)给定一个模式串P和一个主串S,求模式串P在主串S中出现的位置(字符串下标均从1开始)\(Solution:\)模式串中next函数next[i]表示模式串P[1,i]中相等前后缀的最长长度运用双指针:i扫描模式串,j扫描前缀初始化ne[1]=0,i=2,j=0;ne[1]=0;......
  • LeetCode_0028. 找出字符串第一个匹配项的下标,KMP算法的实现
    题目描述  给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹......
  • 扩展KMP (ex_KMP)
    一些约定:字符串下标从1开始s[1,i]表示S的第一个到第i个字符组成的字符串解决的题型:给你两个字符串A,B(A.size()=n,B.size()=m),求p数组p[i]表示最大的len使得A[i,i+len-1]=B[1,len]即A的第i位与B前缀的最大匹配的长度比如;A:aaaabaaB:aaaap数组就是{4321021}算......
  • KMP 算法
    学习笔记我认为我这个算法可能无法讲明白,而且工作量巨大,所以为了让你快速学会我推荐学习下列笔记。学习笔记1学习笔记2学习笔记3例题感觉经过上述的学习,你一定有所收获吧(如果没有的话还是菜就多练吧),所以接下来我会举出一些题目,应该会对你的学习有些帮助。1.【模板】KMP(洛谷......
  • KMP
    呼——终于看懂了KMP——磕了三天了。题目直达Q:KMP是干什么的?是查找字符串用的,可以查找到\(S2\)字符串在\(S1\)字符串中出现的位置(当然,你可以统计出次数)。Q:那复杂度是多少的?通常,我们认为他的复杂度是\(O(|S1|)\),虽然有点常数。常规的的比较方法是直接比较,枚......
  • CSS (border-radius应用) 笔记 08
      border-radius: n1 n2 n3n4 /a1 a2 a3 a4  【n1-a1,n2-a2,n3-a3,n4-a4 分别表示上右下左顺序边角的椭圆边角,其中n代表水平,a代表垂直】e.g有趣的小水滴动画(应用)<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname=&qu......
  • 代码训练营 Day9 | 151.翻转字符串里的单词 | 认识KMP算法
    151.翻转字符串里的单词这道题的难度在于如何高效率的处理空格对于python来说不能实现空间O(1)的复杂度,不过对于其他语言来说下面思路可以使用双指针方法同时指向数组的头部循环遍历整个字符串直到数组末尾快指针不能为空,因为快指针是要获取字母的,慢指针是用来获取新的字......