zoukankan      html  css  js  c++  java
  • poj 3461

    题目: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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    奇偶数排序
    买房子
    首字母大写
    学分绩点
    加减乘除
    最简真分数
    Hdu 1058 Humble Numbers
    Hdu 1032 The 3n + 1 problem
    Hdu 1040 As Easy As A+B
    Hdu 1025 Constructing Roads In JGShining's Kingdom
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5858938.html
Copyright © 2011-2022 走看看