1. 程式人生 > >Power Strings POJ - 2406(next水的一發 || 後綴數組)

Power Strings POJ - 2406(next水的一發 || 後綴數組)

枚舉 nbsp mes define can algo iostream 公共前綴 else

  後綴數組專題的 emm。。

就next 循環節。。/

有後綴數組也可以做

從小到大枚舉長度i,如果長度i的子串剛好是重復了len/i次,應該滿足len % i == 0和rank[0] - rank[i] == 1(整個串的等級比 i位置開始的後綴的等級大1 (i位置開始的後綴即為比總串低一個等級的後綴)) 和height[rank[0]] == len-i (整個串 和 比它低一個等級的串的最長公共前綴的長度 是總長度減去這個循環節的長度)這些條件的

#include <iostream>
#include <cstdio>
#include <sstream>
#include 
<cstring> #include <map> #include <cctype> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define
lap(i, a, n) for(int i=n; i>=a; i--) #define lep(i, a, n) for(int i=n; i>a; i--) #define rd(a) scanf("%d", &a) #define rlld(a) scanf("%lld", &a) #define rc(a) scanf("%c", &a) #define rs(a) scanf("%s", a) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define
mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 1e6+10, INF = 0x7fffffff; int nex[maxn]; void get_next(char *s) { int len = strlen(s); int j, k; j = 0, k = -1, nex[0] = -1; while(j < len) { if(k == -1 || s[j] == s[k]) nex[++j] = ++k; else k = nex[k]; } } char s[maxn]; int main() { while(~rs(s) && s[0] != .) { get_next(s); int n = strlen(s); if(n % (n - nex[n]) == 0) cout<< n / (n - nex[n]) <<endl; else cout<< 1 <<endl; } return 0; }

Power Strings POJ - 2406(next水的一發 || 後綴數組)