Problem A. String Master(master.c/cpp/pas)

题目描述

 所谓最长公共子串,比如串 A:“abcde”,串 B:“jcdkl”,则它们的最长公共子串为串 “cd”,即长
度最长的字符串,且在两个串中都作为连续子串出现过。
给定两个长度都为 n 的字符串,对于字符串大师的你来说,求它们的最长公共子串再简单不过了。
所以现在你有 k 次修改机会,每次你可以选择其中某个串的某个位置,将其修改成任意字符。
你需要合理使用这 k 次修改机会,使得修改之后两个串的最长公共子串最长。相信对于字符串大师
的你来说,这个问题也难不倒你。
Input
第一行包含两个整数 n, k,分别表示字符串的长度和修改次数。
第二行包含一个长度为 n 的仅由小写字符构成的字符串 S。
第三行包含一个长度为 n 的仅由小写字符构成的字符串 T。
Output
输出一行一个整数,即修改完毕之后两个串的最长公共子串的长度。

k<=n<=300

题目大意:两个字符串,任意改动k个字母,使得最长公共子串最长

思路:两个指针i,j,代表从S串第i个位置开始,T串从第j个位置开始,枚举长度len,求出在两边找出的子串在k次修改机会内的最大长度

复杂度:O(N^3)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read(){
char chr=getchar(); int f=,ans=;
while(!isdigit(chr)) {if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<);ans+=chr-'';chr=getchar();}
return ans*f;
}
void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}
const int N=;
char S[N],T[N],tS[N],tT[N];
int n,k,f[N][N];
inline int Check(char *S,char *T){
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int cs=,len;
for(len=;len<=min(n-i+,n-j+);len++){
if(S[i+len-]!=T[j+len-])
if(cs>=k) break;
else cs++;
}ans=max(ans,len-);
}return ans; }
int main(){
freopen("master.in","r",stdin);
freopen("master.out","w",stdout);
n=read(),k=read();
scanf("%s",S+);scanf("%s",T+);
write(Check(S,T));
return ;
}

Problem B. Tourist Attractions(tour.c/cpp/pas)

题目描述

 在美丽的比特镇一共有 n 个景区,编号依次为 1 到 n,它们之间通过若干条双向道路连接。
Byteasar 慕名来到了比特镇旅游,不过由于昂贵的门票费,他只能负担起 4 个景区的门票费。他可
以在任意景区开始游览,然后结束在任意景区。
Byteasar 的旅游习惯比较特殊,一旦他路过了一个景区,他就一定会进去参观,并且他永远不会参
观同一个景区两次。所以他想知道,有多少种可行的旅游路线,使得他可以恰好参观 4 个景区呢?即,
有多少条简单路径恰好经过了 4 个点。
Input
第一行包含两个整数 n,表示景区的总数。
第 2 至第 n + 1 行,每行一个长度为 n 的 01 字符串,第 i + 1 行第 j 个字符为 0 表示 i 和 j 之间
没有道路,为 1 表示有一条道路。
输入数据保证 (i, j) 的连接情况等于 (j, i) 的连接情况,且 (i, i) 恒为 0。
Output
输出一行一个整数,即可行的路线总数。

n<=1500

记得开long long!!!        记得开long long!!!         记得开long long!!!

40pts(直接枚举第一二三四个点,判断是否重复,是否按顺序连通——O(n^4))

70pts(枚举其中的第一二三个点,第四个点个数就是第三个点的度数-1,当然考虑环的情况,如果第三个点和第一个点连通,要再1   要开long long 比赛的时候因为这个丢掉30分) ——O(n^3)

100ptsbitset优化,对于每个类似于a-b-c-d的四元组我们枚举中间的俩元素b-c
    然后对于这一组元素对答案的贡献为(du[b]-1)*(du[c]-1)-包含b-c这组元素的三元环个数
   枚举三元环的个数 ,其中两个元素b-c已经确定,只要再找一个元素x同时满足x-b连通 且x-c连通即可
   然而找到元素x最简单的方法即O(n) 枚举,但是这样的话时间复杂度重新退化为O(n^3)
   于是考虑bitset优化, 假设与b相连的元素集合为s[b],
   则三元环个数即为(s[b]&s[c]).count()(两集合并集中1的个数,即同时与b,c相连)——O(n^3/32)

    本题对于Pascal选手还是不太友好的,但手动bitset也不是不可以/滑稽

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#define int long long //懒人专用
using namespace std;
inline int read(){
char chr=getchar(); int f=,ans=;
while(!isdigit(chr)) {if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<);ans+=chr-'';chr=getchar();}
return ans*f;
}
void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}
int n,a[][],du[];
char s[];
long long ans=;
bitset<> ss[];
signed main(){
freopen("tour.in","r",stdin);
freopen("tour.out","w",stdout);
n=read();
for(register int i=;i<=n;++i){
scanf("%s",s+);
for(register int j=;j<=n;++j)
if(s[j]=='') a[i][j]=;else a[i][j]=,du[i]++;
}
if(n<=)//①40pts,这里码风可能不太友好(考试的时候为了卡常)当然了,如果100分方法看懂了可以略过前两种部分分的方法
for(register int i=;i<=n;++i)
for(register int j=;j<=n;++j){if(i!=j&&a[i][j])
for(register int k=;k<=n;++k){if(j!=k&&i!=k&&a[j][k])
for(register int l=;l<=n;++l){if(i!=l&&j!=l&&k!=l&&a[k][l])++ans;}}}
else if(n<=){
//②70pts
for(register int i=;i<=n;++i)
for(register int j=;j<=n;++j){
if(i==j) continue;
if(!a[i][j]) continue;
for(register int k=;k<=n;++k){
if(i==k||j==k) continue;
if(!a[j][k]) continue;
ans+=du[k]-;
if(a[k][i]) ans--;
}
}
}else{
//③100pts
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(a[i][j]==) ss[i][j]=;else ss[i][j]=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
if(!a[i][j]) continue;
if(i==j) continue;
ans+=(du[i]-)*(du[j]-)-(ss[i]&ss[j]).count();
}
}
write(ans);
return ;
}

Problem C. Walk(walk.c/cpp/pas)

考试妥妥的打暴力系列

在比特镇一共有 n 个街区,编号依次为 1 到 n,它们之间通过若干条单向道路连接。
比特镇的交通系统极具特色,除了 m 条单向道路之外,每个街区还有一个编码 vali,不同街区可能
拥有相同的编码。如果 vali and valj = valj,即 vali 在二进制下与 valj 做与运算等于 valj,那么也会
存在一条额外的从 i 出发到 j 的单向道路。
Byteasar 现在位于 1 号街区,他想知道通过这些道路到达每一个街区最少需要多少时间。因为比特
镇的交通十分发达,你可以认为通过每条道路都只需要 1 单位时间。
Input
第一行包含两个正整数 n, m,表示街区的总数以及道路的总数。
第二行包含 n 个正整数 val1, val2, ..., valn,分别表示每个街区的编码。
接下来 m 行,每行包含两个正整数 ui
, vi,表示一条单向道路,起点为 ui,终点为 vi。
Output
输出 n 行,每行一个整数,其中第 i 行输出到达第 i 个街区的最少时间,如果无法到达则输出 −1

①20分,直接求就好了

②40分,O(n^2)建图,O(n)BFS求最短路

③70分,考虑重新构图,新增1<<15个点,枚举子集(O(n^3)),向点 i 向它所有的子集连一条权值为 0 的有向边,然后在向原图中连回去,可能表达不太对,画个图意会一下//待会儿FFT来说又怪语文老师

④100分,还是新建图,点i 只需要向点 i 去掉某一位的 1 的点连边,这样边的数量得到有效控制

 #pragma GCC optimize(2)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
inline int read(){
char chr=getchar(); int f=,ans=;
while(!isdigit(chr)) {if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<);ans+=chr-'';chr=getchar();}
return ans*f;
}
void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}
const int N=;
int val[N],cnt;
int n,m,ver[N<<],head0[N<<],head1[N<<],nxt[N<<],dis[N<<],tot=,x,y,hd=,tl=,q[N];
bool vis[N<<];
inline void add1(int x,int y){ver[++tot]=y;nxt[tot]=head1[x];head1[x]=tot;}
inline void add0(int x,int y){ver[++tot]=y;nxt[tot]=head0[x];head0[x]=tot;}
void Run(int x,int w){
if(dis[x]>=)return;
dis[q[++tl]=x]=w;
for(int i=head0[x];i;i=nxt[i]) Run(ver[i],w);
if(x>=cnt) return;
for(int i=;i<;i++)if(x>>i&) Run(x^(<<i),w);
}
int main(){
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
n=read(),m=read();cnt=<<;
for(int i=;i<=n;i++) x=read(),add1(i+cnt,x),add0(x,i+cnt);
for(int i=;i<=m;i++) x=read(),y=read(),add1(x+cnt,y+cnt);
for(int i=;i<=n+cnt;i++) dis[i]=-;
Run(cnt+,);
while(hd<=tl)for(int i=head1[x=q[hd++]];i;i=nxt[i])Run(ver[i],dis[x]+);
for(int i=;i<=n;i++) write(dis[i+cnt]),puts("");
return ;
}

【寒假集训系列DAY.1】的更多相关文章

  1. 【寒假集训系列DAY3】

    DAY2的坑之后会补上 DAY3 今天暴力分拿的还是不错的...60+30+25=115,但还是太弱了呀,每题都只会暴力(话说第3题直接输-1给了15分,本以为只会给5分,然后打了半个小时的爆搜... ...

  2. CSU-ACM寒假集训选拔-入门题

    CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中 ...

  3. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  4. 2022寒假集训day2

    day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...

  5. GlitchBot -HZNU寒假集训

    One of our delivery robots is malfunctioning! The job of the robot is simple; it should follow a lis ...

  6. Wooden Sticks -HZNU寒假集训

    Wooden Sticks There is a pile of n wooden sticks. The length and weight of each stick are known in a ...

  7. 今年暑假不AC - HZNU寒假集训

    今年暑假不AC "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" "@#$%^&a ...

  8. FatMouse' Trade -HZNU寒假集训

    FatMouse' Trade FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the wa ...

  9. 畅通工程-HZNU寒假集训

    畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...

随机推荐

  1. mysqlconnector将EXCEL表数据导入数据库

    测试excel和脚本放在同一个目录 测试excel和脚本放在同一个目录 #!/usr/bin/env python #coding=utf-8 import xlrd import mysql.con ...

  2. 【转载】Linux 通过mount -o loop 配置本地.iso镜像为yum源(yum仓库)

    原文地址:https://www.jb51.net/os/RedHat/2682_all.html 如果拷贝到本地,可以使用mount mount fileName mountPoint -o loo ...

  3. HDU1465 不容易系列之一&&HDU4535吉哥系列故事——礼尚往来

    HDU1465不容易系列之一 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是难上加 ...

  4. 44.bucket filter:统计各品牌最近一个月的平均价格

    课程大纲     GET /tvs/sales/_search { "size": 0, "query": { "term": { &quo ...

  5. Maven学习总结(5)——聚合与继承

    Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module> ...

  6. Spring Boot-Starter(九)

    说明 在使用非spring boot项目我们集成spring mvc mybatis等框架往往需要大量xml配置, spring 的推出是为了解决项目的复杂度,随着项目的增长,xml配置会越来越臃肿, ...

  7. broker监控dataguard配置

    使用broker查看dataguard信息时有告警 DGMGRL> show configuration; Configuration - DRTEST Protection Mode: Max ...

  8. ACM数论总结

    ACM数论总结 http://blog.csdn.net/xieshimao/article/details/6425099 断断续续的学习数论已经有一段时间了,学得也很杂,现在进行一些简单的回顾和总 ...

  9. 数组优化 Dijkstra 最短路

    //============================================================================// Name : POJ.cpp// Au ...

  10. O - String Problem KMP 字符串最小表示法

    Give you a string with length N, you can generate N strings by left shifts. For example let consider ...