zoukankan      html  css  js  c++  java
  • poj1961 kmp

    题目大意,求这个字符串到i为止有多少个循环串;

    int k = i-next[i];
    if((i+1)%k == 0 && (i+1)!= k)
    printf("%d %d ", i+1, (i+1)/k);

    这是代码的主要部分,求next数组的部分大家都知道,我来说说这部分的正确性;

    例如一个字符串的第99为指向第96位,也就是说后4-99位和前1-96位是匹配的,就是说94到96与97到99是是匹配的;

    而且91-94与94-96是匹配的。。。。。。。。。。。

    一直可以推到最前面,以上就是正确性啦~

    上代码

    #include <iostream>
    #include <string.h>
    #include <map>
    #include <stdio.h>
    using namespace std;
    const int maxa =1000005;
    int next[maxa];
    int vis[maxa];
    int n;
    void init_kmp(char str[])
    {
    memset(vis, 0, sizeof(vis));
    next[0]=-1;
    for(int i=1;str[i]!=0;i++)
    {
    int j= next[i-1];
    while(str[j+1]!=str[i]&&j>=0)
    j= next[j];
    if(str[j+1] == str[i])
    next[i] = j + 1;
    else
    next[i] = -1;
    }
    }
    int main(){
    char str[maxa];
    int d =1;
    while(scanf("%d", &n), n){
    scanf("%s", str);
    printf("Test case #%d ", d++);
    init_kmp(str);
    for(int i = 0; i < n; i++){
    int k = i-next[i];
    if((i+1)%k == 0 && (i+1)!= k)
    printf("%d %d ", i+1, (i+1)/k);
    }
    printf(" ");
    }
    }

  • 相关阅读:
    冲刺第七,八天(5月27,28日)
    作业4 阅读《构建之法》 第5.5 第6 第7章
    用户模拟+spec
    第二阶段
    第一次Spring总结
    小组互评和自评
    SPRINT四则运算(第二天)
    开始第一段SPRINT
    四则运算APP
    四则运算 测试与封装 (完善) 5.2 5.3
  • 原文地址:https://www.cnblogs.com/icodefive/p/3856183.html
Copyright © 2011-2022 走看看