2020排位赛I(div2)I

I. Where Am I?

题目链接
题目分析:
FJ迷路了,但他可以根据邮箱颜色来定位,已知每个农田旁有一个邮筒,邮筒有26种颜色,FJ可以通过独特的颜色序列来定位,问FJ最少需要看多少个邮筒才能定位。例如7 ABCDABC,答案不能是1,因为A有重复(即使只有一个D也不行),也不能是2,因为AB重复(即使只有一个CD也不行),可以看出题目是要求出一个最小的邮筒个数k,使得所有k长度的子序列都是独一无二的。
思路:
数据很小,暴力枚举所有子串直到出现结果即可,就是题目难懂啊。
代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
char s[105];
char a[105],b[105];
int main(){
	int n;
	cin>>n;
	scanf("%s",s);
	int p=0,res=0;
	while(1){
		res++;
		bool f=true;
		for(int i=0;i<n;i++){
			p=0;
			for(int j=i;j<n;j++){
				a[p++]=s[j];
				int c=i+1,m=0;
				if(p==res){
					for(int x=c;x<n;x++){
						b[m++]=s[x];
						if(m==p){
							/*if(res==49){
								printf("%s\n%s\n",a,b);
							}*/
							if(strcmp(a,b)==0){//如果串相同,res不满足,标记,退出循环。
								f=false;
								break;
							}
							else{
								m=0,x=c,c++;
							}
						}
					}
					if(!f) break;
					if(p==res) break;
				}
			}
			if(!f) break;
		}
		if(f) break;
	}
	cout<<res<<endl;
	return 0;
}

补充:之前我不知道比较子串可以不用像我这么麻烦,可以直接用strncmp函数来搞定就行了= =。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值