AcWing 第14场周赛

区间选数

#include<cstdio>
#include<cstring>
#include<iostream>
#include<ctime>
#include<cstdlib>

using namespace std;
int n,k;
int t; 
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 
    cin>>t;
    while(t--){
        srand((unsigned int)(time(0)));
        int l,r,nl,nr;cin>>l>>r>>nl>>nr;
        int a=rand()%r+l,b=rand()%nr+nl;
        while(1){
            a=rand()%r+l;
            b=rand()%nr+nl; 
            if(a!=b && b<=nr && b>=nl && a>=l && a<=r) break;
        } 
        cout<<a<<" "<<b<<'\n'; 
    }return 0;
} 

食堂排队

看懂题意,模拟就行了

排序时按照编号大小排序,因为给定的l是非降序的,所以只需要根据编号排序

从头开始枚举,每次做四件事
1.如果这个同学的时间超了就跳过后续三件事
2.如果这个同学的入队时间大于上个人打饭时间,时间就调整为当前入队时间
3.记录这个同学的打饭时间
4.时间+1(因为打饭需要一分钟

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
int n;
int t;const int maxn=1e3+10; 
struct node{
	int p,l,r;
}e[maxn];
bool cmp(node a,node b){
	return a.p<b.p;
}
int ans[maxn];
int main(){
	cin>>t;
	while(t--){
		cin>>n;memset(ans,0,sizeof(ans));
		for(int i=1;i<=n;++i) cin>>e[i].l>>e[i].r,e[i].p=i;
		sort(e+1,e+1+n,cmp);
		int head=1;
		for(int i=1;i<=n;++i){
			node a=e[i];
			if(head>a.r) continue; 
			if(head<a.l) head=a.l;
			ans[a.p]=head;
			++head;
		}
		for(int i=1;i<=n;++i) cout<<ans[i]<<" ";  cout<<endl; 
	}
} 

寻找字符串

题意明确

找一个字符串中最长的前缀后缀且相等,且存在一个子串与前后缀相等

前后缀相等,易想到KMP中的nex数组

nex[i]存的便是母串中[0~i]的最长相同前后缀长度,

那么怎么寻找一个子串

我们可以知到的一个信息是,可能的前后缀长度,然后去检验一个子串是否满足这么长

比如母串长度为len

那么目前可能的长度为nex[len],此时如果存在一个k(1<=k<len)满足nex[k]=nex[len],则说明还有一个串存在

例如 a b a a a

nex[5]=1 存在nex[4]=1=nex[5]

此题重要在对nex的理解

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e6+10;
int nex[maxn]={0};
int book[maxn];
char a[maxn],b[maxn];
int lena,lenb;
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>(a+1);lena=strlen(a+1);
		for(int i=2,j=0;i<=lena;++i){
			while(j && a[i]!=a[j+1]) j=nex[j];
			if(a[i]==a[j+1]) ++j;
			nex[i]=j; 
		}
		bool flag=0;memset(book,0,sizeof(book));
		for(int i=1;i<lena;++i) book[nex[i]]++;
		int res=0;
		for(int i=nex[lena];i;i=nex[i]){
			if(book[i]){
				res=i;
				break;
			}
		}
		if(!res)cout<<"not exist";
		else for(int i=1;i<=res;++i) cout<<a[i];
		cout<<endl;
	}return 0;
} 

ZFY AK IOI

posted @ 2021-08-29 17:26  归游  阅读(64)  评论(0编辑  收藏  举报