SPOJ

来源:互联网 发布:英国文化的特点知乎 编辑:程序博客网 时间:2024/06/15 13:39

KMP 循环节出现次数(对于整个串来说)

可见:http://blog.csdn.net/xiang_6/article/details/78426778


#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<cmath>#include<set>#include<queue>#include<stack>#include<map>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;typedef unsigned long long ull;const int maxn = 1e6 + 7, maxd = 1e4 + 7, mod = 1e9 + 7;const ll INF = 0x7f7f7f7f;int n, ans;char s[maxn];int f[maxn];void init() {    f[0] = f[1] = 0;    for(int i = 1; i < n; ++i) {        int j = f[i];        while( j && s[i] != s[j]) j = f[j];        f[i+1] = (s[i] == s[j] ? j+1 : 0);    }    //for(int i = 0; i <= len; ++i)    //    cout << f[i] << " ";}void solve() {    for(int i = 2; i <= n; ++i) {        int t = (i / (i-f[i]));        if( i % (i-f[i]) == 0 && t != 1) {            printf("%d %d\n", i, t);        }    }    puts("");}int main() {    int kase = 1;    int T; scanf("%d", &T);    while(T--) {        scanf("%d", &n);// && n        scanf("%s", s);        init();        printf("Test case #%d\n", kase++);        solve();    }    return 0;}