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函数来搞定就行了= =。