随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

 

找字符串的最短循环节

 

 1. kmp

#include <bits/stdc++.h>
using namespace std ; 
const int N=1e6+1;
 char a[N];
 int n,p[N];
 
 void init(){
 	 int i,j=0;
 	 
 	 for(i=1;i<n;i++){
 	   	while(j>0&&a[i+1]!=a[j+1]) j=p[j];
 	   	if(a[i+1]==a[j+1]) j++;
 	   	
 	   	p[i+1]=j;
	 }
 }
 int main(){
 	while(cin>>a+1,a[1]!='.'){
 		n=strlen(a+1);
 		init();
 		if(n%(n-p[n])) cout<<1<<endl;
 		else  cout<<n/(n-p[n])<<endl;
	}
 }

2. Hash

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
#include <algorithm>
#include <cstring>
using namespace std;
 #define int long long
  const int N=1e6+5;
   
 char a[N];
 int n;
 int h[N],pow[N];
 int bas=29;
  
 int f2(int l,int r){
     return h[r]-h[l-1]*pow[r-l+1];
 }
 void solve(){
        for(int i=1;i<=n;i++){
            if(n%i==0&&f2(i+1,n)==f2(1,n-i)){
                cout<<n/i<<endl;return;
            }
        }
        cout<<1<<endl; 
 }
 signed main(){
    pow[0]=1;
    for(int i=1;i<=1e6;i++) pow[i]=bas*pow[i-1];
    while(cin>>a+1,a[1]!='.'){
        n=strlen(a+1);
        for(int i=1;i<=n;i++) h[i]=h[i-1]*bas+a[i];
         
        solve();
    }
 }

 

posted on   towboat  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示