zoukankan      html  css  js  c++  java
  • POJ-3461 Oulipo (KMP)

    题意:t个例子,给出两个字符串然后其其中一个串在另一个串中出现的个数

    思路:还是利用KMP来进行字符串匹配,然后对其稍微进行修改,在匹配结束后对其进行移动,移动到nex[j]

    模板:

    int kmp(){
    
        int ans = 0;
        int i= 0,j=0;
        if(len1 == 1 && len1 == 1)
        {
           return  (a[0] == b[0])?1:0;
        }
        getnext();
        for(i=0;i<len1;i++)
        {
            while(j>0&&a[i]!=b[j])
                j=nex[j];
            if(a[i]==b[j])    j++;
            if(j==len2)
            {
                ans++;
                j=nex[j];
            }
        }
        return ans;
    }

    完整题解:(cin不加速会超时,也可以换scanf就没有问题)

    #include<iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define maxn 1000050
    char a[maxn],b[maxn];
    int nex[maxn];
    int len2,len1; 
    void getnext(){
        int i= 0,j =-1;//i为副串的序号 
        nex[i] = j;
        while(i<len2){
            if(j==-1||b[i]==b[j]){
                nex[++i] =++j;
            }else j = nex[j];
        }
    }
    int kmp(){
    
        int ans = 0;
        int i= 0,j=0;
        if(len1 == 1 && len2 == 1)
        {
           return  (a[0] == b[0])?1:0;
        }
        getnext();
        for(i=0;i<len1;i++)
        {
            while(j>0&&a[i]!=b[j])
                j=nex[j];
            if(a[i]==b[j])    j++;
            if(j==len2)
            {
                ans++;
                j=nex[j];
            }
        }
        return ans;
    }
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        int T;
        cin>>T;
        while(T--){    
            cin>>b>>a;
            len1 = strlen(a);
            len2 = strlen(b);
            int ans = kmp();
            cout<<ans<<endl;
        }
    } 
  • 相关阅读:
    【SQL跟踪工具】SQL Profiler 跟踪器
    使用Fiddler调试手机端页面请求/抓包
    SQL 常用判断语句
    VS中常用快捷键
    博客园博客自动生成目录/目录索引
    BZOJ 1135 P3488 LYZ-Ice Skates 线段树+Hall
    BZOJ 4823 老C的方块
    POJ
    BZOJ 1299 [LLH邀请赛]巧克力棒
    BZOJ 2437 [Noi2011]兔兔与蛋蛋
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11208589.html
Copyright © 2011-2022 走看看