POJ 2406 Power Strings

题意:给一个字符串,问最多可以用多少个子串重复构成,例如ababab是3个ab组成的。

解法:kmp模板题……以前做过……然而现在几乎忘了失败指针什么的怎么来的……http://kb.cnblogs.com/page/176818/讲的挺好的……

根据最后一个字符记录的失败指针位置可以知道最后一个重复的节点的长度,即总字符串长度减失败指针。用总长除以这个长度就是答案了……

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int p[1000005];
int main()
{
    ios :: sync_with_stdio(false);//cin果断T了……
    string s;
    while(cin >> s && s[0] != '.')
    {
        int ans = 0;
        int j = 0;
        memset(p, 0, sizeof(p));
        for(int i = 1; i < s.size(); i++)
        {
            while(j > 0 && s[j] != s[i]) j = p[j];
            if(s[j] == s[i]) j++;
            p[i + 1] = j;
        }
        if(s.size() % (s.size() - p[s.size()]) == 0)
            cout << s.size() / (s.size() - p[s.size()]) << endl;
        else
            cout << "1" << endl;
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Apro/p/4531596.html