uva 1328(kmp)

被打哭了......神特么kmp,还能这么用!看来我理解的还不够透彻,这里最神奇的就是只有相同的字串才能往下延伸,而"i-f[i]"就正好是前面空出来的模板块,也就是f[i]中不计数的那块,而字符串都是从0开始的,对应的往下加一个却正好成立构成倍数关系

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1000000+100;
int f[maxn];
string p;
int n;
int main()
{  int kase=0;
    while(~scanf("%d",&n)&&n)
    {  kase++;
        cin >> p;
        f[0]=0,f[1]=0;
        for(int i=1; i<n; i++)
        {
            int j=f[i];
            while(j&&p[i]!=p[j]) j=f[j];
            f[i+1]=(p[i]==p[j]?j+1:0);
        }
        printf("Test case #%d\n",kase);
        for(int i=2; i<=n; i++)
            if(f[i]>0&&i%(i-f[i])==0)
            {
                printf("%d %d\n",i,i/(i-f[i]));
            }
            printf("\n");
    }
    return 0;
}

,很神奇,这是什么,规律?

时间: 2024-08-05 07:05:03

uva 1328(kmp)的相关文章

UVa 1328 (KMP求字符串周期) Period

当初学KMP的时候也做过这道题,现在看来还是刘汝佳的代码要精简一些,毕竟代码越短越好记,越不容易出错. 而且KMP的递推失配函数的代码风格和后面的Aho-Corasick自动机求失配函数的代码风格也是一致的. 1 #include <cstdio> 2 3 const int maxn = 1000000 + 10; 4 char s[maxn]; 5 int f[maxn]; //失配函数 6 7 int main() 8 { 9 //freopen("in.txt",

UVA 1328 - Period KMP

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36131 题意:给出一个长度为n的字符串,要求找到一些i,满足说从1~i为多个个的重复子串构成,并输出子串的个数. 题解:对kmp中预处理的数组的理解 //作者:1085422276 #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #i

uva 1328 - Period (周期串的判断 kmp)

题意:给一个长为n的字符串,问字符串的前缀是不是周期串,如果是周期串,输出前缀的最后一个字母的位置和最短周期 思路:kmp字符串匹配的性质运用. 对于前i个字符,如果f[i]不等于零,说明在此字符串的前缀中,有一部分[0,f[i]]和本字符串[i-f[i],i]的这一部分是相同的.如果这i个字符组成一个周期串,那么错开的一部分[f[i],i]恰好是一个循环节.(换句话说,如果满足f[i]不等于零 && [f[i],i]是循环节这两点,就可以说明前i个字符组成一个周期串) code: #in

UVa 1328 Period

方法:kmp code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 #include <stack> 8 #include <bitset> 9 #include <cstdlib> 10

uva 11557 - Code Theft(KMP)

题目链接:uva 11557 - Code Theft 题目大意:给定n个文本,每个文本有一个文本名,现在给出一个文本,求给定文本和n个文本中连续相同行数最大值,并且输出文本名,注意为0时不用输出其它的文本名. 解题思路:将每个字符串用映射成一个hash值,然后对匹配文本枚举后缀,建立失配数组进行KMP匹配,记录下每个文本的匹配最大值. #include <cstdio> #include <cstring> #include <map> #include <st

UVA 11557 - Code Theft (KMP + HASH)

UVA 11557 - Code Theft 题目链接 题意:给定一些代码文本,然后在给定一个现有文本,找出这个现有文本和前面代码文本,重复连续行最多的这些文本 思路:把每一行hash成一个值,然后对于每一个文本计算最大匹配值,枚举后缀,然后利用KMP去找即可 代码: #include <cstdio> #include <cstring> #include <vector> #include <string> #include <iostream&g

uva 1358 - Generator(KMP+期望)

题目链接:uva 1358 - Generator 题目大意:给定n,表示有n中字符,然后给定一个字符串S,一开始字符串为空,现在每次随机生成一个1~n的字符添加到字符串末尾,问说字符串包含S为子串的生成次数期望. 解题思路:首先要对S进行预处理,求出失配数组. 定义dp[i]表示末尾部分匹配了i个S串所需要的次数期望,每次枚举可能出现的字符1~n.对于S字符串,i+1肯定是确定的字符,所以对于其他字符肯定是不匹配的. 假设现在生成了k字符,并且说k字符不等于S[i+1],那么根据S的失配数组,

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 475 - Wild Thing(KMP)

UVA 475 - Wild Thing 题目链接 题意:给定一个带通配符的文件名作为格式,后面跟一个文件名,要求输出符合格式的文件名 思路:先把带通配符的文件名根据星号位置进行分解,然后对于每个文件名去判断,判断的方法用KMP,如果格式的每段都能在文件名中不断往后一一匹配上,那么就是可以的,注意考虑开头和结尾没有星号的情况,还有这题就是如果找不到一个合适的,就什么都不输出,包括换行 代码: #include <cstdio> #include <cstring> #include