Period UVALive - 3026(next数组)

题意:

  给出一个长度不超过1000000的字符串S, 对于该字符串的所有前缀求其周期, 如果周期K >= 2输出起始位置是第几个字符和其周期K

解析:

  先求next数组

  对于每一个位置如果i % (i-next[i]) == 0 && i /(i - next[i]) >= 2 则成立 即i-next[i] 为其最短循环节

  周期为i /(i - next[i])

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#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 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 = 1000010, INF = 0x7fffffff;
int nex[maxn];
int tlen;
string str;
void get_nex()
{
    mem(nex, 0);
    int j, k;
    j = 0, k = -1, nex[0] = -1;
    while(j < tlen)
    {
        if(k == -1 || str[j] == str[k])
            nex[++j] = ++k;
        else
            k = nex[k];
    }
}

int main()
{
    int n, kase = 0;
    while(cin>> n && n)
    {
        cin>> str;
        tlen = str.size();
        get_nex();
        printf("Test case #%d\n", ++kase);
        for(int i=1; i<=n; i++)
        {
            if(i % (i-nex[i]) == 0 && i /(i - nex[i]) >= 2)
                cout<< i << " " << i/(i - nex[i]) <<endl;
        }
        cout<< endl;
    }

    return 0;
}

原文地址:https://www.cnblogs.com/WTSRUVF/p/9461066.html

时间: 2024-11-21 04:57:33

Period UVALive - 3026(next数组)的相关文章

【暑假】[实用数据结构]UVAlive 3026 Period

UVAlive 3026 Period 题目: Period Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive),

UVALive - 3026 - Period (KMP)

UVALive - 3026 Period Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want

Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)

参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html 总结一下,如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且 循环节长度为:   i - next[i] 循环次数为:       i / ( i - next[i] ) 1 #include <iostream> 2 #include <cstdi

UVALive 3026 Period (KMP算法简介)

kmp的代码很短,但是不太容易理解,还是先说明一下这个算法过程吧. 朴素的字符串匹配大家都懂,但是效率不高,原因在哪里? 匹配过程没有充分利用已经匹配好的模版的信息,比如说, i是文本串当前字符的下标,j是要匹配的模版串当前正在匹配的字符的下标.(下标都从零开始) 当匹配到i = 4, j = 4的时候失配了,朴素的匹配做法是往右边移一位然后从j开始扫,这样做效率很低. 不难发现前面已经匹配好的串ab是相同的最大前缀后缀.把串移动到后缀的第一个位置正好是 朴素的匹配过程中第一次匹配能把这个前缀匹

UVALIVE 3026 Period

题意:给你一个字符串,问第i位前是否有循环节,若存在,则循环节是多少? 思路:考察失配函数f[i]的意义.只要i%(i-f[i])==0,则循环节长度为i/(i-f[i]).字符在[0,f[i]],[i-f[i],i]范围内的相等,所以如果存在循环节则每i-f[i]可以分为一段.理解起来比较抽象,模拟一遍. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib

Period II---fzu1901(Next数组)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1901 给你一个字符串 s 求出所有满足s[i] == s[i+p] ( 0 < i+p < len )的 p ; kmp中Next[i] 表示前i个字符的前缀和后缀的最大匹配 s[0--x] == s[i-x-1 --- i] ; 下面是看别人的解释: •知识点:KMP算法.对next数组的理解 •KMP算法中next数组的含义是什么? •next数组:失配指针 •如果目标串的当前字符i在匹配到模式串的第

UVAlive 3026 KMP 最小循环节

KMP算法: 一:next数组:next[i]就是前面长度为i的字符串前缀和后缀相等的最大长度,也即索引为i的字符失配时的前缀函数. 二:KMP模板 1 /* 2 pku3461(Oulipo), hdu1711(Number Sequence) 3 这个模板 字符串是从0开始的 4 Next数组是从1开始的 5 */ 6 #include <iostream> 7 #include <cstring> 8 using namespace std; 9 10 const int m

HDOJ1358 Period (KMP next数组应用)

题意:n个字符的字符串,从第二个字符开始遍历.如果从第一个字符到当前字符是有循环的,那么输出当前的位置和最大循环次数.两组数据之间输出一个空格. 所以我们需要先解决如何算出(1...x)串的最大循环次数,再遍历就ok 所以如何找到最小循环节,如果(1...x)有循环x-next[x]就是循环节,可以在纸上画画,从前往后可以用"1...x-next[x]"这串字符推出整个串.而且这是最小循环节,因为next记录的是前后缀的最大匹配长度,可以反证就不说了. 如果(1...x)没有循环节,x

poj 1961 Period 【KMP-next前缀数组的应用】

题目地址:http://poj.org/problem?id=1961 Sample Input 3 aaa 12 aabaabaabaab 0 Sample Output Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4 题目分析:给你一个字符串,最大长度1百万.输出是:以第1组样例解释,在aaa的字符串中,长度为2时,存在2个循环节a.当长度为3时,存在3个循环节a.以第二组样例解释,当长度为2时,存在2个循环节a.当长度为6时,存在2个循