• Kattis


    String Matching

    Input

    The input consists of several test cases. Each test case consists of two lines, first a non-empty pattern, then a non-empty text. Input is terminated by end-of-file. The input file will not be larger than 5 Mb.

    Output

    For each test case, output one line containing the positions of all the occurences of pattern in text, from first to last, separated by a single space.

    Sample Input 1Sample Output 1
    p
    Popup
    helo
    Hello there!
    peek a boo
    you speek a bootiful language
    anas
    bananananaspaj
    
    2 4
    
    5
    7

    题意

    多组输入,每组两行,模式串和对比串,输出上面的模式串在下面的字符串中的所有位置下标,下标从0开始

    思路1

    KMP算法,套个模版就可以了

    思路2

    用string的find,str2.find(str1,x),关于这个函数的用法http://www.cplusplus.com/reference/string/string/find/

    代码1

    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int const MAXM = 4000000;
    char s[MAXM], t[MAXM];
    int next[MAXM], n;
    int shuchu[MAXM];
    void get_next()
    {
        next[0] = -1;
        int i = 0, j = -1;
        while (t[i] != '')
        {
            if (j == -1 || t[i] == t[j])
            {
                i++;
                j++;
                next[i] = j;
            }
            else
                j = next[j];
        }
    }
    
    int KMP()
    {
        get_next();
        int i = 0, j = 0, ans = 0, len = strlen(t);
        while (s[i])
        {
            if (j == -1 || s[i] == t[j])
            {
                i++;
                j++;
            }
            else
                j = next[j];
            if (j == len)
            {
                j = next[j];
                shuchu[ans++] = i;
            }
        }
        return ans;
    }
    
    int main()
    {
        
        while (gets(t)) {
            gets(s);
            int ss = KMP();
            for (int i = 0; i < ss; i++)
            {
                if (i)printf(" ");
                printf("%d", shuchu[i]-strlen(t));
            }
            puts("");
        }
    }

    代码2

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        string str1,str2;
        int cnt[100000];
        while(getline(cin,str1)){
            getline(cin,str2);
            int pos=0,x=0;
            while(str2.find(str1,x)!=-1&&x<str2.size()){
                cnt[pos++]=str2.find(str1,x);
                x=cnt[pos-1]+1;
            }
            for(int i=0;i<pos;i++){
                printf("%d%c",cnt[i],i==pos-1?'
    ':' ');
            }
        }
        return 0;
    } 
  • 相关阅读:
    用Zend Studio12 导入在workspace中的项目
    PHP 统计中文字符串的长度
    jQuery判断checkbox是否选中的3种方法
    js,jquery获取下拉框选中的option
    HTML与XHTML的区别
    HTML头部
    HTML框架标签
    js的继承
    图片懒加载
    Http请求的gzip压缩
  • 原文地址:https://www.cnblogs.com/zhien-aa/p/6284119.html
Copyright © 2020-2023  润新知