Acwing第 14 场周赛完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing第 14 场周赛完结相关的知识,希望对你有一定的参考价值。
3821. 区间选数【难度: 简单 / 知识点:思维】
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
int x,y,xx,yy; cin>>x>>y>>xx>>yy;
int ans1=x,ans2=xx;
while(1)
{
if(ans1==ans2) ans2++;
else break;
}
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}
3822. 食堂排队【中 / 知识点: 模拟】
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,id;
}Node[1005];
bool cmp(node a,node b)
{
if(a.l==b.l) return a.id<b.id;
return a.l<b.l;
}
int t,n,st[1005];
int main(void)
{
cin>>t;
while(t--)
{
cin>>n;
memset(st,0,sizeof st);
for(int i=0;i<n;i++) cin>>Node[i].l>>Node[i].r,Node[i].id=i+1;
sort(Node,Node+n,cmp);
int k=0;
for(int i=1;i<=5000;i++)
{
if(Node[k].l<=i&&Node[k].r>=i)
{
st[Node[k].id]=i;
k++;
while(k<n&&Node[k].r<=i) k++;
}
if(k>=n) break;
}
for(int i=1;i<=n;i++) cout<<st[i]<<" ";
cout<<endl;
}
return 0;
}
3823. 寻找字符串【难 / 知识点: KMP】
摘自: https://www.acwing.com/activity/content/code/content/1711095/
KMP 可以求出 s 的每个前缀的最长前后缀匹配长度 match
由于 t 在还需要在 s 中间出现,这个在中间出现的 t 同时也是 s 的某个前缀的前缀和后缀,
所以还是可以用 KMP 求
具体来说:
统计出 match[1..n-2] 中的最大值 mxM(下标从 0 开始)
若 t 在 s 中间存在,则 match[n-1], match[match[n-1]-1], ... 中必然能找到一个不超过 mxM 的数
这个数就对应着在 s 中间出现的 t
说白了就是找最大前缀的,最大前缀
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n;
char s[N];
int ne[N];
bool st[N];
int main(void)
{
int t; cin>>t;
while(t--)
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=2,j=0;i<=n;i++)
{
while(j&&s[i]!=s[j+1]) j=ne[j];
if(s[i]==s[j+1]) j++;
ne[i]=j;
}
for(int i=0;i<=n;i++) st[i]=false;
for(int i=1;i<n;i++) st[ne[i]]=true;
int res=0;
for(int i=ne[n];i;i=ne[i])
if(st[i])
{
res=i;
break;
}
if(!res) puts("not exist");
else
{
s[res+1]=0;
printf("%s\\n",s+1);
}
}
return 0;
}
以上是关于Acwing第 14 场周赛完结的主要内容,如果未能解决你的问题,请参考以下文章