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

poj 3461

时间:2016-09-10 11:34:10      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题目:http://poj.org/problem?id=3461

题目大意:

题目的大意是:在一个串W中找出串T出现的次数,串T可以再W中重叠出现,即 W="AZA",T="AZAZAZA",可以出现的形式有 AZA  ZAZA,AZ  AZA  ZA,AZAZ   AZA。

 

/*
    kmp裸题
*/
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int p[100001],n;
string a,b;
int main(){
    scanf("%d",&n);
    for(int q=1;q<=n;q++)
    {
        cin>>b>>a;
        int x=a.length(),y=b.length();
        a=" "+a;b=" "+b;
        int j=0;
        for(int i=2;i<=y;i++)
        {
            while(j>0&&b[j+1]!=b[i]) j=p[j];//从b[j+1]开始找与b[i]相同的字母
            if(b[j+1]==b[i]) j++;
            p[i]=j;//如果找到相同字母,p[i]记录此位置,否则p[i]=p[i-1]
        }
        j=0;
        int ans=0;
        for(int i=1;i<=x;i++)
        {
            while(j>0&&b[j+1]!=a[i]) j=p[j];//按p[j]后退找出与a[i]相同的b[j+1]
            if(b[j+1]==a[i]) j++;//如果找到则向后前进
            if(j==y) ans++;//如果在t中找到完整的b +1
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

poj 3461

标签:

原文地址:http://www.cnblogs.com/xiaoningmeng/p/5858938.html

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