FZU 1901

#include <iostream>
#include <cstring>

考查了对next数组的了解

using namespace std;
#define max 1000005
int next[max],l,ans[max];
char s[max];
void getNext(){
    int j,k;
    next[0]=-1;
    j=0;k=-1;
    while(j<l){if(k==-1||s[j]==s[k])    {
            j++;
            k++;
            next[j]=k;
        }
        else
            k=next[k];
    }
}
int main(){
    int t;
    cin>>t;
    int game=0;
    while(t--){
        game++;
        cin>>s;
        l=strlen(s);
        getNext();
        int t=next[l];
        int cnt=0;
        while(t){
            ans[cnt++] = l-t;
            t=next[t];
        }
         ans[cnt++] = l;

cout<<"Case #"<<game<<": "<<cnt<<endl;
        for(int i = 0;i < cnt-1;i++)cout<<ans[i]<<" ";
        cout<<ans[cnt-1]<<endl;

}
    return 0;
}

FZU 1901,布布扣,bubuko.com

时间: 2024-11-16 11:33:41

FZU 1901的相关文章

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

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>

第二周 9.6-9.12

9.6 FZU 1901 Period II 并不需要完整的周期.即最后一段可以不完整. 所以直接沿Next往后找就可以了. 行末不能有空格不然PE. 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <vector> 5 using namespace std; 6 int m,Next[1000100]; 7 char b[1000100]; 8 9

KMP 总结

再次回来总结KMP,发现有点力不从心,学久了,越觉得越来越不理解了. 估计是写KMP已经不下50遍了吧.每次用都是直接默写.. KMP算法,串模式匹配算法,通过预处理得到next数组,再进行匹配. 几个要重点记忆的地方: 1. next数组的含义 next[i] = t 表示以i位置结尾的前缀串(相对于原串是前缀串)的真前缀和真后缀相等的最大值为t 2. 最小覆盖子串: 我不会证明,但是记得住结论,记len表示字符串的长度,则这个字符串的最小覆盖子串为 len - next[len] 3. KM

KMP模板及总结

KMP是一种字符串匹配算法,它在时间复杂度上较暴力匹配算法由很大的优势.比如我要找字符串S中是否存在子串P,如果暴力匹配的话,则时间复杂度为O(n*m),而kmp算法时间复杂度为O(n+m). 这里我们有一个辅助的数组next[](先别管怎么求出来的),next[i]含义是模式串P中[0....i-1]这一段的长度小于这段字符串的长度的最长公共前缀(比如ababa,公共前缀就是aba). 好,那我们接下来讲一下kmp算法的具体操作: 假设,我们开始有字符串S:ababaaba   模式串P:ab

FZU 2150 Fire Game(点火游戏)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h2 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 18.0000pt } h3 {

FZU 1096 QS Network

QS Network Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original ID: 1096 64-bit integer IO format: %I64d      Java class name: Main In the planet w-503 of galaxy cgb, there is a kind of intelligent creature named QS.

BZOJ 1901 Dynamic Rankings

题面: 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 8088  Solved: 3364[Submit][Status][Discuss] Description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]--a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变

FZU 1759 欧拉函数 降幂公式

Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a singl