码迷,mamicode.com
首页 > 其他好文 > 详细

HDU-1686-Oulipo

时间:2016-07-11 20:55:10      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出一个串,求另一个串中有多少个这个串

KMP,根据next数组特性解题。

#include<cstdio>
#include<cstring>
using namespace std;

int Next[10000+5];
//str1是长的,str2是短的
char str1[1000000+5],str2[10000+5];
int cnt;

void getNext(int len2)
{
    int i=0,j=-1;
    Next[0]=-1;
    while(i<len2)
    {
        if (j==-1||str2[i]==str1[j])
        {
            i++,j++;
            if (str2[i]!=str2[j])
                Next[i]=j;
            else
                Next[i]=Next[j];

        }
        else
        {
            //这是j=Next[j]  数组下标是j
            j=Next[j];
        }
    }
}

int kmp(int len1,int len2)
{
    int i=0,j=0;
    getNext(len2);
    while(i<len1)
    {
        if (j==-1||str1[i]==str2[j])
        {
            i++,j++;
        }
        else
        {
            j=Next[j];
        }

        if (j==len2)
        {
            cnt++;
            //初始化也是j=Next[j] 而不是j=0
            j=Next[j];
        }
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin);
//    freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif
    int n;
    int len1,len2;
    scanf("%d%*c",&n);
    while(n--)
    {
        gets(str2);
        gets(str1);
        len1=strlen(str1);
        len2=strlen(str2);
        cnt=0;
        kmp(len1,len2);
        printf("%d\n",cnt);
    }
    return 0;
}

 

HDU-1686-Oulipo

标签:

原文地址:http://www.cnblogs.com/s1124yy/p/5661311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!