UVA10298 Power Strings [KMP]

  题目传送门

Power Strings

格式难调,题面就不放了。

一句话题意,求给定的若干字符串的最短循环节循环次数。

输入样例#1:

abcd
aaaa
ababab
.

输出样例#1:

1
4
3

就这样。



  分析:

  一道思路神奇的题目,需要深入理解$KMP$的$next$数组。

  如果自己写几个字符串推一下就可以发现,一个由循环节构成的字符串,从第二个循环节开始$next$值是依次递增的,因为$next$数组的本质是表示$0\~i-1$的最长公共前缀后缀长度。也就不难想到,只要判断一下$next[n]$的值就行了。

  Code:

//It is made by HolseLee on 11th Aug 2018
//UVA10298
#include<bits/stdc++.h>
using namespace std;

const int N=2e6+7;
int n,nxt[N],k;
char s[N];

int main()
{
    while(scanf("%s",s)){
        if(s[0]==‘.‘)break;
        n=strlen(s);
        nxt[0]=nxt[1]=0;k=0;
        for(int i=1;i<n;++i){
            while(k&&s[i]!=s[k])
            k=nxt[k];
            nxt[i+1]=(s[i]==s[k]?++k:0);
        }
        printf("%d\n",((!nxt[n])||(nxt[n]&&n%(n-nxt[n]))?1:n/(n-nxt[n])));
    }
    return 0;
}

原文地址:https://www.cnblogs.com/cytus/p/9458887.html

时间: 2024-10-28 09:53:56

UVA10298 Power Strings [KMP]的相关文章

poj 2406 Power Strings KMP匹配

对于数组s[0~n-1],计算next[0~n](多计算一位). 考虑next[n],假设t=n-next[n],如果n%t==0,则t就是问题的解,否则解为1. 这样考虑: 比如字符串"abababab", a  b a b a b a b * next     -1 0 1 2 3 4 5 6  7 考虑这样的模式匹配,将"abababab#"当做主串,"abababab*"当做模式串,于是进行匹配到n(n=8)时,出现了不匹配: 主串   

POJ 2406 Power Strings KMP运用题解

本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都觉得是可以利用next数组的,但是自己想了很久没能这么简洁地总结出来,也只能查查他人代码才恍然大悟,原来可以这么简单地区求一个周期字符串的最小周期的. 有某些大牛建议说不应该参考代码或者解题报告,但是这些大牛却没有给出更加有效的学习方法,比如不懂KMP,难倒不应该去看?要自己想出KMP来吗?我看不太可能有哪位大牛可以直接自己"重新创造出KMP"来吧. 好吧,不说"创造KMP

UVA - 10298 Power Strings (KMP求字符串循环节)

Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiati

UVA 10298 - Power Strings(KMP)

UVA 10298 - Power Strings 题目链接 题意:本意其实就是,给定一个字符串,求出最小循环节需要几次循环出原字符串 思路:利用KMP中next数组的性质,n - next[n]就是最小循环节,然后n / 循环节就是答案 代码: #include <cstdio> #include <cstring> const int N = 1000005; char str[N]; int next[N]; void getnext() { int n = strlen(s

poj 2406 Power Strings(KMP&amp;思维)

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 31093   Accepted: 12974 Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "

poj2406 Power Strings (KMP)

这题跟HDU 1358 Period (KMP)差不多,稍微修改代码就行了. 关于KMP的更多知识,请关注从头到尾彻底理解KMP(2014年8月4日版). #include<stdio.h> #include<string.h> int n,next[1000000]; char p[1000000]; void getnext() { int k=0,j=1; next[0]=-1;next[1]=0; while (j<n) { if (k==-1||p[j]==p[k]

poj 2406 Power Strings(kmp的nxt数组找最小循环节)

题目链接:poj 2406 Power Strings 题意: 给你一个字符串,让你找出这个字符串的最大循环次数,及最小循环节. 题解: 用kmp的nxt数组搞搞,L=j-nxt[j],为前缀j的最小循环节. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define F(i,a,b) for(int i=(a);i<=(b);++i) 5 using namespace std;

hdu 2406 Power Strings KMP

Power Strings                                                               Time Limit:3000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Description Given two strings a and b we define a*b to be their concatenation. For example, if a =

POJ - 2406 Power Strings (KMP循环节)

Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative inte