2 solutions
-
0
难度: 绿
算法: 字符串哈希,KMP
不想用 KMP,所以直接上哈希。首先哈希一遍字符串。讲一个小技巧:
对于一个字符串 ,其循环节为 等价于以下两个条件的交:
整除
有了以上性质,就可以使用哈希快速判断是否满足。
然后直接从小到大判断是否可行即可。
我觉得讲的已经够了,还不懂看代码。
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ll; ll n,m,p[1000100]={1},h[1000100],b=1e9+7; string s; int main(){ ios::sync_with_stdio(0); cin>>n>>s; s="s"+s;//占位符 for(ll i=1;i<=n;i++) p[i]=p[i-1]*b;//求哈希 for(ll i=1;i<=n;i++) h[i]=h[i-1]+p[i]*s[i]; for(ll i=1;i<=n;i++){//求答案 m=(n/i)*i; if(h[m]-h[i]==(h[m-i])*p[i]&&(h[n]-h[m])==h[n-m]*p[m]){ cout<<i;//输出 return 0; } } }
- 1
Information
- ID
- 47
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 9
- Tags
- # Submissions
- 9
- Accepted
- 6
- Uploaded By