【寒假集训系列DAY.1】
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)
③100pts (bitset优化,对于每个类似于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】的更多相关文章
- 【寒假集训系列DAY3】
DAY2的坑之后会补上 DAY3 今天暴力分拿的还是不错的...60+30+25=115,但还是太弱了呀,每题都只会暴力(话说第3题直接输-1给了15分,本以为只会给5分,然后打了半个小时的爆搜... ...
- CSU-ACM寒假集训选拔-入门题
CSU-ACM寒假集训选拔-入门题 仅选择部分有价值的题 J(2165): 时间旅行 Description 假设 Bobo 位于时间轴(数轴)上 t0 点,他要使用时间机器回到区间 (0, h] 中 ...
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- 2022寒假集训day2
day1:学习seach和回溯,初步了解. day2:深度优化搜索 T1 洛谷P157:https://www.luogu.com.cn/problem/P1157 题目描述 排列与组合是常用的数学方 ...
- GlitchBot -HZNU寒假集训
One of our delivery robots is malfunctioning! The job of the robot is simple; it should follow a lis ...
- Wooden Sticks -HZNU寒假集训
Wooden Sticks There is a pile of n wooden sticks. The length and weight of each stick are known in a ...
- 今年暑假不AC - HZNU寒假集训
今年暑假不AC "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" "@#$%^&a ...
- FatMouse' Trade -HZNU寒假集训
FatMouse' Trade FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the wa ...
- 畅通工程-HZNU寒假集训
畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...
随机推荐
- vue命令行创建运行工程
// install vue-cli 安装依赖包 npm install --g vue-cli// 使用vue-cli初始化项目 vue init webpack my-project// inst ...
- PAT_A1018#Public Bike Management
Source: PAT A1018 Public Bike Management (30 分) Description: There is a public bike service in Hangz ...
- 关于JS闭包的一点理解
通常来讲,闭包通常是指函数内部可以访问到外部作用域的一个过程. 一.广义的定义:任何函数都产生了闭包. 二.狭义的定义:函数内部能访问到其他变量函数的作用域. 我们来看个例子 var a = 10; ...
- kesci---2019大数据挑战赛预选赛---情感分析
一.预选赛题------文本情感分类模型 本预选赛要求选手建立文本情感分类模型,选手用训练好的模型对测试集中的文本情感进行预测,判断其情感为「Negative」或者「Positive」.所提交的结果按 ...
- Lua操作符的优先级
lua 操作符的优先级 lua操作符的优先级 如表所示(从高到低) 在二元操作符中,除了指数操作符 “^” 和连接操作符 “..” 是 ”右结合” 的,是所有其他操作符都是 “左结合” 的.因此如 ...
- wget扒网站
wget神奇操作 整站复制 只限静态网页 wget -P 指定下载路径 -p 获取显示HTML页面所需的所有图像 -k 使链接指向本地文件 -H 递归时转到外部主机. wget --mirro ...
- windows桌面远程工具连接Ubuntu
1.Ubuntu安装:sudo apt-get install xrdp sudo apt-get install vnc4server sudo apt-get install xubuntu ...
- Leetcode 49.字母异位词分组
字母异位词分组 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", " ...
- fzu 2122
#include<stdio.h> #include<string.h> #define N 51000 char s1[200],s2[200],s[N]; int main ...
- 浅析gcc、arm-linux-gcc和arm-elf-gcc关系
浅析gcc.arm-linux-gcc和arm-elf-gcc关系 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是 ...