hdu1686 KMP裸题

秋招快有着落啦,十一月中去北京区赛膜拜众神。

哎,好长一段时间没有刷过,重头拾起,最近得专题是字符串。

Trie前一排又敲了一遍,KMP今天敲了一下。

题目一大堆废话,实际就是判断模式串出现得次数,我是对着算法导论伪代码敲得,一次AC,真得很水。

/***********************************************************
	> OS     : Linux 3.13.0-24-generic (Mint-17)
	> Author : yaolong
	> Mail   : [email protected]
	> Time   : 2014年09月24日 星期三 15时31分51秒
 **********************************************************/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int next[12345];
char p[12345];
char T[1234567];
void build_next ( int m )
{
    next[1] = 0;
    int k = 0;
    for ( int q = 2; q <= m; q++ )
    {
        while ( k > 0 && p[k + 1] != p[q] )
        {
            k = next[k];
        }
        if ( p[k + 1] == p[q] )
        {
            k = k + 1;
        }
        next[q] = k;
    }
}
int kmp ( int n, int m )
{
    build_next ( m );
    int q = 0;
    int res = 0;
    for ( int i = 1; i <= n; i++ )
    {
        while ( q > 0 && p[q + 1] != T[i] )
        {
            q = next[q];
        }
        if ( p[q + 1] == T[i] )
        {
            q = q + 1;
        }
        if ( q == m )
        {
            //cout << "Here" << i-m<<"q";
            ++res;
            q = next[q];
            //cout<<q<<endl;
        }
    }
    return res;
}
int main()
{
    int C;
    p[0]=T[0]='1';
    while(scanf("%d",&C)!=EOF){
        while(C--){
            scanf("%s",p+1);
            scanf("%s",T+1);
            printf("%d\n",kmp(strlen(T)-1,strlen(p)-1));
        }

    }
}
时间: 2024-10-20 05:01:42

hdu1686 KMP裸题的相关文章

51Nod 1277 字符串中的最大值(KMP,裸题)

1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd. 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值. 例如:S = "abababa" 所有的前缀如下: "a", 长度与出现次数的乘积 1 * 4 = 4, "ab",长度与出

hdu1686 KMP水题

题意是给出文本串和模式串  玩模式串在文本串中出现多少次         把KMP稍稍改动下就ok了 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; char str1[10010],str[1000100]; int next[10010]; int deal(int len) { next[0]=-1; int j=0; int k=-1; while(j<

hdu2087(kmp裸题)

Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符,则不再进行工作. Output 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出

SZOJ 167 Lca裸题

一道.......一道我改了一周的裸题 无根树建双向边 无根树建双向边 无根树建双向边 重要的事情说三遍(微笑) 还有要开longlong 还有双向边不是双倍边(微笑) 我真是,能把自己气吐血10次就不把自己气吐血9次 [问题描述] 已知一棵nn个点的树,点从1开始标号,树上每条边都有一个正整数边权. 有qq个询问,每个询问由type,u,vtype,u,v三个正整数构成. 当type=1type=1时,询问uu到vv路径上所有边权的二进制异或和. 当type=2type=2时,询问uu到vv路

hdu1159 poj1458 LCS裸题

HDU 1159 题意:找LCS 思路:裸题 n*m的写法,我的写法好像比较奇怪...用一个ci保存s2第i位可以做为s1的公共子序列的最大值,s1的每一位遍历s2,遍历的时候记录前面出现过的ci的最大值,ci一定是一个连序的上升序列,我的好像不是正经的LCS的算法,改天还是要学习一个的 AC代码: #include "iostream" #include "string.h" #include "stack" #include "qu

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro

POJ 3624 Charm Bracelet(01背包裸题)

Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible fro

HDOJ-1232 畅通工程【并查集裸题】

题目传送门 : http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集的裸题 AC code: #include <iostream> #define MAXN 1050 using namespace std; int pre[MAXN]; int Find(int pos) { int r = pos; while (r != pre[r]) r = pre[r]; int i = pos; while (i != r) { int t = p

【不可能的任务22/200】【填坑】bzoj3224 splay裸题

人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 1 #include <cstdio> 2 int root,N=0,n,p,q; 3 int fa[100001],c[100001][2],size[100001],sp[100001]; 4 void rot(int x) 5 { 6 int y=fa[x],k=(c[y][0]==x); 7 size[y]=size[c[y][k]]+size[c[x][k]]+1;size[x]=size[c[x][!k]]+