POJ2406 字符串的最小循环节 字符串哈希

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define pb push_back
#define fi first
#define se second
#define io std::ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
//const double pi=acos(-1);
const ll p = 998244353, INF = 0x3f3f3f3f;
const ll mod=1e9+7;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll exgcd(ll a, ll b, ll &x, ll &y) {if(!b) {x = 1; y = 0; return a;}ll r = exgcd(b, a % b, x, y);ll tmp = x; x = y, y = tmp - a / b * y;return r;}
ll qpow(ll a,ll n,ll modd){ll r=1%mod;for (a%=modd; n; a=a*a%modd,n>>=1)if(n&1)r=r*a%modd;return r;}
const double eps=1e-5;
const ll maxn=1e6+10;
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
char a[maxn];
long long h[maxn];
long long po[maxn];
long long geth(int l,int r)
{
   return ((h[r]-h[l-1]*po[r-l+1])%mod+mod)%mod;
}
int main()
{

  while(~scanf("%s",a+1))
  {
      if(a[1]=='.')
        break;
      int n=strlen(a+1);
      po[0]=1;
      for(int i=1;i<=n;i++)
      {
          h[i]=(h[i-1]*p+a[i])%mod;
          po[i]=po[i-1]*p%mod;
      }
      for(int i=1;i<=n;i++)
      {    ll v=geth(1,i);
          int flag=1;
          if(n%i)
            continue;
          for(int l=i+1;l<=n;l+=i)
          {
              int r=l+i-1;
              if(r>n)
              {
                  flag=0;
                  break;
              }
              if(geth(l,r)!=v)
                {   flag=0;
                    break;
                }
          }
          if(flag)
          {
              printf("%d\n",n/i);
              break;
          }
      }
  }
}

 

posted @ 2021-04-10 22:29  摸鱼选手LLF  阅读(46)  评论(0编辑  收藏  举报