【链接】h在这里写链接


【题意】


让你维护字符串的一段区间内T子串的个数。

【题解】


因为t不大,所以。
暴力维护一下a[i]就好。
a[i]表示的是S串从i位置开始,能和T串匹配几个字符。
用树状数组维护区间内a[i]==lent的个数就好。
修改,还是暴力改就行。只会影响到那几个位置的。


【错的次数】


0

【反思】


匹配的部分写在一个函数里面比较好,用起来比较方便。

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 1e5;
struct BI {
    int a[N + 10];     int lowbit(int x) {
        return x&(-x);
    }     void add(int x, int y) {
        while (x <= N) {
            a[x] += y;
            x += lowbit(x);
        }
    }     int sum(int x) {
        int now = 0;
        while (x > 0) {
            now += a[x];
            x -= lowbit(x);
        }
        return now;
    }     int get_sum(int l, int r) {
        return sum(r) - sum(l - 1);
    } }BIT; char s[N + 20], t[20 + 20];
int Q,a[N+20],lens,lent; void pipei(int pos) {
    a[pos] = 0;
    for (int j = 1; j <= lent && pos + j - 1 <= lens; j++)
        if (s[pos + j - 1] == t[j])
            a[pos] = j;
        else
            break;
} void geta() {
    for (int i = 1; i <= lens; i++) {
        pipei(i);
        if (a[i] == lent) BIT.add(i, 1);
    }
} void in() {
    scanf("%d", &Q);
    scanf("%s%s", s + 1, t + 1);
    lens = strlen(s + 1), lent = strlen(t + 1);
} void cl() {
    for (int i = 1; i <= Q; i++) {
        char r[5];
        scanf("%s", r);
        if (r[0] == 'Q') {
            int a, b;
            scanf("%d%d", &a, &b);
            if (b - lent + 1 < a)
                puts("0");
            else
                printf("%d\n", BIT.get_sum(a,b-lent+1));
        }
        else {
            int pos;
            scanf("%d%s", &pos, r);
            s[pos] = r[0];
            for (int j = max(1,pos - lent + 1); j <= pos; j++) {
                int temp = a[j];
                pipei(j);
                if (temp == lent) {
                    if (a[j] != lent) {
                        BIT.add(j, -1);
                    }
                }
                else
                    if (a[j] == lent)
                        BIT.add(j, 1);
            }
        }
        puts("");
    }
} int main() {
    //freopen("F:\\rush.txt", "r", stdin);
    //ios::sync_with_stdio(0), cin.tie(0);
    int T;
    scanf("%d", &T);
    while (T--) {
        in();
        geta();
        cl();
    }
    return 0;
}

【2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 G】Query on a string的更多相关文章

  1. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  2. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)

    参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...

  3. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  4. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  5. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  6. 【2017 ACM/ICPC 乌鲁木齐赛区网络赛环境测试赛 E】蒜头君的排序

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 莫队算法+树状数组. 区间增加1或减少1. 对逆序对的影响是固定的. (用冒泡排序变成升序的交换次数,就是逆序对的个数) [错的次数] 0 [ ...

  7. 2017 乌鲁木齐赛区网络赛 J Our Journey of Dalian Ends 费用流

    题目描述: Life is a journey, and the road we travel has twists and turns, which sometimes lead us to une ...

  8. [刷题]ACM/ICPC 2016北京赛站网络赛 第1题 第3题

    第一次玩ACM...有点小紧张小兴奋.这题目好难啊,只是网赛就这么难...只把最简单的两题做出来了. 题目1: 代码: //#define _ACM_ #include<iostream> ...

  9. 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory li ...

  10. 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

    鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Fo ...

随机推荐

  1. ESP8266学习笔记4:ESP8266的SmartConfig

    今天花了将近一天的时间来研究ESP8266的SmartConfig功能,这个应该算是wifi云产品的标配.这篇文章先把SmartConfig操作一遍,我还写了还有一篇文章梳理了物理层的详细协议,点击这 ...

  2. 【面试加分项】java自己定义注解之申明注解

    之前的博客http://blog.csdn.net/u010590685/article/details/47029447介绍了java的注解的基本知识今天我们学习怎样使用自己定义注解. 首先我们要声 ...

  3. vim基础学习之搜索功能

    当我们使用vim看源码的时候,我们可能会碰到一个方法或者变量,我们想要知道这个变量在其他地方的使用情况.这时候我们经常的做法就是退出当前的文件,或者是重新切换一个终端,然后使用grep或者find等s ...

  4. ASP.Net简单的交互案例

    控制器 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  5. Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disa

    转自:https://blog.csdn.net/ouyangtianhan/article/details/6797999 Unable to find required classes (java ...

  6. #学习笔记#——JavaScript 数组部分编程(六)

    14. 题目描述 实现一个打点计时器,要求 1.从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2.返回的对象中需 ...

  7. MD基本语法介绍

    Markdown基本语法介绍 前言 文本编辑器一般用的有富文本编辑器(也就是Word)和md了,但是wold太过于花里胡哨很多功能都用不上,所以就选择md了,简单实用,一对于我来说一般就用标题和列表就 ...

  8. Slick教程

    Slick 编程(1): 概述 Slick 编程(2): 准备开发环境 Slick 编程(3): 基本查询 Slick 编程(4): 数据库连接和事务处理 Slick 编程(5): 数据库Schema ...

  9. [NOIP2013]车站分级 解题报告

    妈蛋这道普及组水(神)题搞了我非常久. 一. 首先一个非常显然的事情就是每一个火车告诉了站与站之间的等级关系,所以拓扑求最长路. 可是发现暴力建边的话最坏能够达到500*500,所以时间复杂度有O(M ...

  10. IPv6地址表示方法详解

    IPv6是互联网协议的第六版:最初它在IETF的 IPng选取过程中胜出时称为互联网新一代网际协议(IPng),IPv6是被正式广泛使用的第二版互联网协议. 现有标准IPv4只支持大概40亿(4×10 ...