总结:这一周打的比赛较上周多,但是有些比赛发挥不太好,主要在模拟的过程中出现差错,原因是只在头脑中想而没有动笔记录下来,导致某个细节出错。在打天梯赛的时候,一开始是领先的,然后卡题又不想走,花了很多时间也写不出来,看着别人赶超自己,心里开始着急,后面的题目仓促思考,心态也不稳,导致本应该能写出来的题也没做出来。签到题写得快是有优势,但是卡题的时候也要暂时舍题,同时要稳住心态,暂时落后也不要着急,细心思考,在草稿纸上模拟记录。另外也暴露出一个问题,就是对字符串的知识稍微薄弱,接下去得补充练习一些字符串的知识和题目。这周总结下来,就是要注意在比赛中稳住心态,不要怕落后,越是着急越难想出来,放平心态,专注比赛。
Floyd算法:动态算法,也称插点法,是全源最短路算法
建图:邻接矩阵
能判负边权和负环
时间复杂度:n^3,最大n=10^2
状态表示:d[k,i,j]表示从i到j,且中间只经过节点编号1-k到最短路径的长度
状态计算
(1)路径不经过k点,继承原值:d[k,i,j]=d[k-1,i,j]
(2)路径经过k点,松弛操作:d[k,i,j]=d[k-1,i,k]+d[k-1,k,j];
模版:
void Floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
路径的记录与递归输出:
void Floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][j]>d[i][k]+d[k][j]){
d[i][j]=d[i][k]+d[k][j]; //记录i-j的最短路
p[i][j]=k; //记录插点
}
}
void path(int i,int j){
if(p[i][j]==0) return; //如果两点之间无插点
int k=p[i][j];
path(i,k);
cout<<k;
path(k,j);
int main(){
Floyd();
cin>>a>>b;
cout<<a;
path(a,b);
cout<<b;
}
补题:
SMU 2024 spring 天梯赛3(补题)-优快云博客
Codeforce round 937 div4.
题意:T组数据,每次给出n长度的字符串,找出一个最小的子串,使得这个子串能拼接成原字符串的同时最多有一个位置的字符不同,长度相同,输出这个子串的长度。
思路:从小到大(显然,只需要找1-n/2范围)找出原字符串长度的因子,存入vector中。
然后每次取出最小的一个因子v[i],易证出,取原字符串前两个v[i]长度的子串,分别从原字符串开头开始对比,有两处不同就结束,如果两个都不能成功就说明这个长度的子串不行。
代码:
#include<bits/stdc++.h>
#define ll long long
#define mm memset
#define EPS 1e-8
#define INF 0x7fffffff
//register int
using namespace std;
void ok(){
int n,k=0;
string s;
cin>>n>>s;
vector<int>v;
for(int i=1;i<=n/2;i++){
if(n%i==0) v.push_back(i);
}
for(int i=0;i<v.size();i++){
for(int w=0;w<=v[i];w+=v[i]){
bool ok=1;
string a;
a=s.substr(w,v[i]);
int u=0,sum=0;
for(int k=0;k<n;k++,u++){
if(s[k]!=a[u%v[i]]){
sum++;
if(sum==2){
ok=0;
break;
}
}
}
if(ok){
cout<<v[i]<<endl;
return;
}
}
}
cout<<n<<endl;
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t=1;
cin>>t;
while(t--){
ok();
}
return 0;
}