1. 程式人生 > >Power Strings POJ - 2406,字符串hash

Power Strings POJ - 2406,字符串hash

包含 break printf esp include pri 輸入數據 pan fine

題目鏈接:POJ - 2406

題目描述

定義兩個字符串s1和s2的乘積s1*s2為將s1和s2連結起來得到的字符串。
例如:s1="xy",s2="z",那麽s1*s2="xyz"。
由此可以定義s1的冪次:s1^0="",s1^n=s1*s1^(n-1),n>0。

輸入

輸入包含多組測試數據。
每組數據由一行構成,包含一個字符串s。
輸入數據以"."結束。

輸出

對於每組輸入數據輸出一行,找出最大的正整數n,使得存在某個字符串a,s = a^n.

樣例輸入

abcd
aaaa
ababab
.

樣例輸出

1
4
3
題解:字符串hash,然後枚舉子串長度,。模板套一下就可以
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define pb push_back
#define ll long long
#define ull unsigned long long
#define rank wepsdas
#define PI 3.14159265
#define ls l,m,rt<<1
#define
rs m+1,r,rt<<1|1 #define eps 1e-7 using namespace std; const int base=23; const int N=1e6+100; const int mod=1e9+7; struct hash { char s[N]; ull h[N],qp[N]; ll p[N],len,val[N]; void init() { h[0]=val[0]=0; qp[0]=p[0]=1; len=strlen(s+1);
for(int i=1;i<=len;i++) { qp[i]=qp[i-1]*base; h[i]=h[i-1]*base+s[i]; } } ull get_hash(int l,int r) { return h[r]-h[l-1]*qp[r-l+1]; } }ac; bool judge(int l) { ull tmp=ac.get_hash(1,l); for(int i=l+1;i<=ac.len;i+=l) { if(tmp!=ac.get_hash(i,i+l-1))return false; } return true; } int main() { while(scanf("%s",ac.s+1)) { ac.init(); if(ac.len==1&&ac.s[1]==.)break; // printf("%s",ac.s+1); //? for(int i=) int ans=-1; for(int i=1;i<=ac.len;i++) { if(ac.len%i==0) { if(judge(i)) { ans=i;break; } } } printf("%d\n",ac.len/ans); } return 0; }

Power Strings POJ - 2406,字符串hash