FZU - 1901 Period II (kmp)

传送门:FZU - 1901

题意:给你个字符串,让你求有多少个p可以使S[i]==S[i+P] (0<=i<len-p-1)。

题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看了别人的博客打脸了,发现自己掉坑了了...一开始想的是找出最小循环节,只要每次输出多加一个循环节,最后输出len就好了。后来发现最小循环节的倍数并不能表示所有循环节。看到的一组例子ababaaaabab,应该输出7,9,11;但是最小循环节的输出是7,11。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6
 7 char a[1000100];
 8 int nt[1000100];
 9
10 void kmp_nt(int m)
11 {
12     int i,j;
13     i = 0;
14     nt[0] = j =-1;
15     while(i < m){
16         while(j!=-1&&a[i]!=a[j])
17             j = nt[j];
18         if(a[i]==a[j]||j==-1){
19             i++;
20             j++;
21             nt[i]=j;
22         }
23     }
24 }
25
26 int main()
27 {
28     int t;
29     cin>>t;
30     for(int i=1;i<=t;i++){
31         cin>>a;
32         cout<<"Case #"<<i<<": ";
33         int len=strlen(a);
34         kmp_nt(len);
35         queue<int>q;
36         int ans=nt[len];
37         while(ans>0){
38             q.push(ans);
39             ans=nt[ans];
40         }
41         cout<<q.size()+1<<endl;
42         while(!q.empty()){
43             cout<<len-q.front()<<‘ ‘;
44             q.pop();
45         }
46         cout<<len<<endl;
47     }
48     return 0;
49 }

原文地址:https://www.cnblogs.com/lilibuxiangtle/p/12585300.html

时间: 2024-10-12 07:45:34

FZU - 1901 Period II (kmp)的相关文章

FZU 1901 Period II

Problem Description For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the prefix is a “period” of S. We want to all the periodic prefixs. Input Input contains multiple cases. The first line contains an i

poj1961 &amp; hdu 1358 Period(KMP)

poj 题目链接:http://poj.org/problem?id=1961 hdu题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 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 to know whether

Scrapy精华教程(六)——自动爬取网页之II(CrawlSpider)

一.目的. 在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中使用基于Spider实现了自己的w3cschool_spider,并在items.py中定义了数据结构, 在pipelines.py中实现获得数据的过滤以及保存. 但是以上述方法只能爬取start_url列表中的网页,而网络爬虫如google等搜索引擎爬虫实现的就是对整个互联网的爬取,所以在本教程中研究使用scrapy自动实现多网页爬取功能. 在教程(五)

HDU 4513 吉哥系列故事——完美队形II(Manacher)

Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意: 3.从左到中间那

HDU3336-Count the string(KMP)

Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4449    Accepted Submission(s): 2094 Problem Description It is well known that AekdyCoin is good at string problems as well as n

CQU 单词替换(KMP)

单词替换(KMP) Time Limit: 500 MS Memory Limit: 64000 K Description 给出一个仅包含小写字母的字符串s,和单词A,B.把s中所有的出现过的A替换为B. Input 第一行一个数T(1<=T<=10),表示数据组数 每组数据三行,第一行为s,第二行为A,第三行为B.所有字符串仅包含小写字母 且长度小于5,000,000. Output 每组数据输出一行,替换后的字符串. Sample Input 3 aaa a b aaa aa b aba

串的模式匹配算法(KMP)

算法: #include<IOSTREAM> using namespace std; #define MAXSIZE 100 void calNext(const char *T,int *next);//T为模式串,next为预判数组 int kmp_match(const char *S,const char *T);//在主串S中寻找模式串T,如果找到返回其位置,否则返回-1.位置从0开始 void calNext(const char *T,int *next) { int n =

HDU 2594 Simpsons’ Hidden Talents (KMP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594 这题直接用KMP算法就可以做出来,不过我还尝试了用扩展的kmp,这题用扩展的KMP效率没那么高. KMP算法: #include<stdio.h> #include<iostream> #include<string.h> using namespace std; int next[50001]; char p[50000],s[50000]; void getnex

119. Pascal&#39;s Triangle II(LeetCode)

Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3,3,1]. Note:Could you optimize your algorithm to use only O(k) extra space? class Solution { public: vector<int> getRow(int rowIndex) { vector<int&