2017 济南综合班 Day 3

T1  黑化

题意:

求一个字符串是否可能包含另一个字符串

字符串中的?可以匹配任意字母

可能输出 God bless You!

一定不可能 输出 Game Over!

计算fail数组时,fail数组不具有传递性

例:

pqkbpqsbqszz
pqkbpq?z

在z处失配后:

pqkbpqsbqszz
        pqkbpq?z

z匹配成功,误认为包含

因为计算fail时,?匹配了 k,而匹配时 ?匹配了s

s不和k匹配

即?不具有传递性

#include<cstdio>
#include<cstring>
#define N 100001
using namespace std;
int lens,lent,f[N];
char s[N],t[N];;
void getfail()
{
    int j;
    for(int i=1;i<lent;i++)
    {
        j=f[i];
        while(j && t[i]!=t[j]) j=f[j];
        f[i+1]= t[i]==t[j] ? j+1 : 0;
    }
}
void work()
{
    int j=0;
    for(int i=0;i<lens;i++)
    {
        while(j && s[i]!=t[j] && s[i]!=‘?‘ && t[j]!=‘?‘) j=f[j];
        if(s[i]==t[j] || s[i]==‘?‘ || t[j]==‘?‘) j++;
        if(j==lent) { printf("God bless You!\n"); return; }
    }
    printf("Game Over!\n");
}
int main()
{
    freopen("trigger.in","r",stdin);
    freopen("trigger.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s%s",t,s);
        lent=strlen(t);
        lens=strlen(s);
        getfail();
        work();
    }
}

T2 便当

不共行不共列 --> 原图行列交换无影响

原图转化成这样

然后DP

#include<cstdio>
#define N 210
#define mod 504
using namespace std;
int n,k,dp[N][N];
int main()
{
    freopen("kill.in","r",stdin);
    freopen("kill.out","w",stdout);
    scanf("%d%d",&n,&k);
    if(k>=n*2) { printf("0"); return 0; }
    dp[0][0]=1;
    n=(n<<1)-1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=k;j++) dp[i][j]=dp[i-1][j];
        for(int j=1;j<=k;j++) dp[i][j]=(dp[i][j]+dp[i-1][j-1]*((i+1)/2*2-1-(j-1)))%mod;
    }
    printf("%d",dp[n][k]);
}

T3 蝉

正解 树链剖分线段树维护等差序列

弃疗

90 暴力法:

连续的操作1一块儿弄,spfa

#include<cstdio>
#include<queue>
#include<cstring>
#define N 200001
using namespace std;
int tot,front[N],to[N*2],nxt[N*2];
int dis[N],tmp[N];
bool v[N],have[N];
queue<int>q;
void add(int u,int v)
{
    to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
    to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
}
void bfs()
{
    memset(dis,-1,sizeof(dis));
    dis[1]=0; q.push(1);
    int now;
    while(!q.empty())
    {
        now=q.front(); q.pop();
        for(int i=front[now];i;i=nxt[i])
         if(dis[to[i]]==-1)
         {
             dis[to[i]]=dis[now]+1;
             q.push(to[i]);
         }
    }
}
void spfa()
{
    int now;
    while(!q.empty())
    {
        now=q.front(); q.pop(); v[now]=false;
        for(int i=front[now];i;i=nxt[i])
         if(dis[to[i]]>dis[now]+1)
         {
             dis[to[i]]=dis[now]+1;
             if(!v[to[i]]) q.push(to[i]),v[to[i]]=true;
         }
    }
}
int main()
{
    freopen("cicada.in","r",stdin);
    freopen("cicada.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    int u,vv;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&u,&vv);
        add(u,vv);
    }
    bfs();
    have[1]=true;
    int opt,x;
    while(m--)
    {
        scanf("%d%d",&opt,&x);
        if(opt==1)
        {
            if(tmp[0])
            {
                spfa();
                for(int j=1;j<=tmp[0];j++) printf("%d\n",dis[tmp[j]]);
                tmp[0]=0;
            }
            if(!have[x]) q.push(x),dis[x]=0,v[x]=true;
        }
        else tmp[++tmp[0]]=x;
    }
    if(tmp[0])
    {
        spfa();
        for(int j=1;j<=tmp[0];j++) printf("%d\n",dis[tmp[j]]);
    }
}

时间: 2024-10-16 03:08:31

2017 济南综合班 Day 3的相关文章

2017 济南综合班 Day 5

毕业考试 (exam.cpp/c/pas) (1s/256M) 问题描述 快毕业了,Barry希望能通过期末的N门考试来顺利毕业.如果他的N门考试平均分能够达到V分,则他能够成功毕业.现在已知每门的分数不能够超过R:他的第i门考试目前得分为Ai,如果想要在这门科目增加一分则需要多写Bi篇论文.Barry想知道,如果想要毕业的话,他最少需要写多少篇论文? 输入格式(exam.in) 第一行三个整数,N, R, V,分别代表考试科目数,每门考试的最高分,需要达到的平均分. 接下来的N行每行两个整数A

2017 济南综合班 Day 4

T1 外星人 二维前缀和 #include<cstdio> #define N 1001 using namespace std; bool v[N][N]; int sum[N][N]; int main() { freopen("alien.in","r",stdin); freopen("alien.out","w",stdout); int r,c,p,q; scanf("%d%d%d%d&quo

2017 济南综合班 Day 6

循环移动 (cyclic.cpp/c/pas) (1s/256M) 问题描述 给出一个字符串S与N个操作.每个操作用三元组(L, R, K)进行描述:操作将字符串第L个到第R个位置构成的子串循环移动K次.一次循环移动就是将字符串最后的这个字符移动到第一位,其余的字符顺次后移. 例如,对于字符串abacaba,操作(L=3, R=6, K=1)后得到的字符串即为abbacaa. 求出在N个操作后得到的字符串. 输入格式(cyclic.in) 第一行一个字符串S. 第二行一个整数N,代表操作的总数.

2017 济南综合班 Day 7

 a 两个指针L.R R开始指向恰好[R,n]有不超过k个逆序对的地方 随着L的右移,R指针只会右移 逆序对有2部分 1.L左侧与其他位置形成的逆序对 2.R右侧与其他位置形成的逆序对 用树状数组分别维护这两部分 同时维护当前逆序对个数 每次L右移,新的L会增加与L左侧的逆序对和与R右侧的逆序对 每次R右移,R的消失会减少R右侧的逆序对和与L左侧的逆序对 #include<cstdio> #include<algorithm> #define N 100012 using name

2017 济南精英班 Day1

不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in","r",stdin); freopen("bpmp.out","w",stdout); int n,m; scanf("%d%d",&n,&m); int ans=(1ll*n*m-1)%998244353; prin

罗森伯格再次荣获《2017年度综合布线十大品牌》以及《2017年度数据中心解决方案优秀供应商》两项大

"中国智能建筑品牌奖"由千家品牌实验室评选并颁发,综合了千家智客全年品牌监测数据.市场调查分析.用户反馈.专家评议以及用户投票等因素,评选出十大综合布线品牌等多项大奖.罗森伯格再次荣获<2017年度综合布线十大品牌>以及<2017年度数据中心解决方案优秀供应商>两项大奖. "中国智能建筑品牌奖"是智能建筑领域极具含金量的年度大奖,自2002年首次颁发,至今已有十五年的历史.由于评选客观.公正.权威,"中国智能建筑品牌奖"也

2017 济南集训DAY1.AF

LIST T1 水题(water) T2 梦境(dream) T2 动态规划(dp) T1 水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽分别是xi和yi.对于第二副牌的每张牌长和宽分别是aj和bj.第一副牌的第i张牌能覆盖第二副牌的第j张牌当且仅当xi>=aj并且yi>=bj.(注意牌不能翻转)当然一张牌只能去覆盖最多一张牌,而不能覆盖好多

如何解读梯形图编程原则?

如何解读梯形图编程原则?plc程序设计方法又是怎样的?与大家一起学习!! 梯形图编程原则与PLC程序设计方法 (1)  输入/输出继电器.内部辅助继电器.定时器.计数器等器件的触点可以多次重复使用,无需复杂的程序结构来减少触点的使用次数. (2) 梯形图每一行都是从左母线开始,线圈终止于右母线.触点不能放在线圈的右边,如下图所示 (3)除步进程序外,任何线圈.定时器.计数器.高级指令等不能直接与左母线相连. (4)在程序中,不允许同一编号的线圈两次输出(双线圈输出).下面的梯形图是不允许的. (

2017-2018-2 20179225 《密码与安全新技术专题》 第5周作业

2017-2018-2 <密码与安全新技术>第3周作业 课程:<密码与安全新技术> 班级:2017级92班 学号:20179225 上课教师:谢四江 主讲教师:王志强 上课日期:2018年5月10日 必修/选修: 必修 主要内容:基于模糊测试的漏洞挖掘及攻防技术 一.背景及意义 1 安全漏洞定义: 简单来说安全漏洞就为存在的缺陷与不足,使别人容易攻破或着入侵电脑. 精确定义:是指信息系统在设计.实现或者运行管理过程中存在的缺陷或不足,从而使攻击者能够在未授权的情况下利用这些缺陷破坏