2016 全国多校第二场 训练日志

solve 4 (131/582)

Acperience (解方程)

Eureka (几何点对相关)

It‘s All In The Mind (签到)

Keep On Movin (签到)

La Vie en rose (字符串hash)

<qj>

思路:

正解可能是dp之类的,用hash字符串水了出来。

1.对于t串,hash成一个数字。                 复杂度O(|t|)

2.对s进行一次滚动hash。                  复杂度O(|s|)

3.

对于截取的一段ss,如果ss的hash值等于t的hash值,那么直接输出1;        复杂度O(1)

对于截取的一段ss,如果这个值以前用过,如果标记为1,那么输出1,否则输出0;    复杂度O(1)

对于截取的一段ss,如果没出现过,暴力跑一次,并且输出,然后标记。        复杂度O(|t|)

对于第三步的第三种情况,很难造出这种数据的,所以,复杂度可接受。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;

unordered_map<ull,int> mp;

int n,m;
char s[100005],t[5005];
int lens,lent;

ull base = 131;
ull po[100105],hs[100005];

ull geth(int l,int r){
    return (ull)hs[r]-po[r-l+1]*hs[l-1];
}

int main(){
    po[0]=1;
    for(int i=1;i<=100000;i++){
        po[i]=po[i-1]*base;
    }

    int T;cin>>T;
    while(T--){
        mp.clear();
        scanf("%d%d",&n,&m);
        scanf("%s%s",s+1,t+1);
        lens=strlen(s+1);lent=strlen(t+1);

        ull tt=0;
        for(int i=1;i<=lent;i++)
            tt=tt*base+(ull)t[i];

        for(int i=1;i<=lens;i++){
            hs[i]=hs[i-1]*base+s[i];
        }

        for(int i=1;i<=lens-lent+1;i++){
            ull ss = geth(i,i+lent-1);
            if(tt==ss){
                printf("1");continue;
            }
            if(mp.find(ss)!=mp.end()){
                if(mp[ss]==1)printf("1");
                else printf("0");
                continue;
            }
            bool ok=1;
            for(int j=1;j<=lent;j++){
                if(s[i+j-1]==t[j])continue;
                if(j==lent){
                    ok=0;break;
                }
                if(t[j]==s[i+j] && t[j+1]==s[i+j-1]){
                    j++;
                }
                else {
                    ok=0;break;
                }
            }
            if(ok){
                printf("1");mp[ss]=1;
            } else {
                printf("0");mp[ss]=-1;
            }
        }
        for(int i=lens-lent+1;i<lens;i++)printf("0");
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/dowhile0/p/9190093.html

时间: 2024-11-05 19:41:26

2016 全国多校第二场 训练日志的相关文章

多校第二场 简单排序计算

思路:先按交叉相乘之差排序好了计算就行了. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <map> #include <cstdlib> #include <queue> #include <stack> #include <vector> #include <ctype.

2017 全国多校第十场 训练日志

solve 2(310 / 634) J题题意搞错一口大锅. dzcH题结论猜对了,只是树上二分图不用匈牙利算法,能换成更高效的写法. B Array Challenge 高斯消元 + 矩阵快速幂 H Monkeys 二分图结论 J Schedule 优先队列 <qj> 题意: 有n个任务,给你开始时间和结束时间,有无数台机器,每台机器可以在同一时间最多处理一个任务,并且开机之后,只能关一次机,不能中途关机又开机. 问至少需要多少机器,在这么多台机器的情况下,最少花费多少.(花费 = 每台机器

hdu 5734 Acperience(2016多校第二场)

Acperience Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 484    Accepted Submission(s): 258 Problem Description Deep neural networks (DNN) have shown significant improvements in several applic

2018湖南多校第八场 训练日志

solved 3 (7/22) 前缀和乱搞的题看成是模拟退火求最小费马点,很烦. C Permutations (子序列) D Travel Frog (dp + 公式) H Appositive Body (中心对称的结论) <qj> 题意:4维空间里n个点,是否能够中心对称. 首先利用所有点求出中心点的坐标,然后对于每个点,求出对应点的坐标,在set中查找是否存在. 所有的点都有对应点,那么存在. #include <cstdio> #include <iostream&

2018-3-17-湖南多校第二场

湖南多校第2场 A:太水 队友直接秒了 C: Hedwig's Ladder 队友打了个表,然后一眼规律 类似于斐波拉契 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include <set> 7 #include <iostream> 8 #include

hdu_6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】

题目链接 有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形. 然后根据这个结论来做. 我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[i]->p[j]) (j>i),只判断这个向量左侧可否存在两个点与它一起构成一个正方形.这样算的结果是,计数每个正方形时,它的靠右和靠下的两条边都会为ans贡献一个单位,所以最后ans要除以2. #include<bits/stdc++.h> using namespace std;

hdu_6050: Funny Function (2017 多校第二场 1006) 【找规律】

题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include<bits/stdc++.h> using namespace std; typedef long long LL; const LL mod=1e9+7; LL qpow(LL x,LL n) //求x^n%mod { LL ret=1; for(; n; n>>=1) { if(n&

hdu 5305 Friends(2015多校第二场第6题)记忆化搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给你n个人,m条关系,关系可以是online也可以是offline,让你求在保证所有人online关系的朋友和offline关系的朋友相等的情况下,这样的情况有多少种. 思路:因为online关系和offline关系的人数相等,而且m最多才28,所以只要枚举每个人的一半的关系是否符合要求即可,而且根据题意m是奇数或者有一个人的总关系为奇数那么就没有符合要求的情况,这样可以排除很多情况.

2015多校第二场 1004( Delicious Apples )

题意:有一条圆形的路,你的仓库在0点,这条路长l,然后有n个苹果树,每个数的坐标是xi(顺时针),每棵树上有ai个苹果.你有个篮子,能装k个苹果,问你用这个篮子将所有苹果装回仓库所走的最短路为多少? 1≤n,k≤105,ai≥1,a1+a2+...+an≤105 1≤L≤109 0≤x[i]≤L 请特别注意上面的苹果个数的条件.因为我的学长 就是从这个条件成功做出了这道题,orz! 因为苹果数不超过10^5,所以将每个苹果当作点. 用一个数组pos记录每个苹果距0点的距离,排序后,然后就可以用另