noip推荐系列:遥控车[字符串+高精+二分答案]
2014-11-05 08:59
369 查看
【问题描述】
平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i]。韵韵早就迫不及待地想玩名字是s的遥控车。可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀(也就是说能确定一个i,使s是name[i]的前缀),这时她就能玩第i辆车;或者是一个无中生有的名字,即s不是任何一辆车名字的前缀,这时候她什么也不能玩。你需要完成下面的任务:
1.韵韵想了m个她想要的名字,请告诉她能玩多少次。
2.由于管理员粗心的操作,导致每辆车的摆放位置都可能出现微小的差错,原来第i辆车现在的位置可能是i-1、i、i+1中的任意一个(第1辆车的位置不可能是0,第n辆车的位置不可能是n+1)。请你计算出共有多少种可能的排列。
注:数据保证当s是name[i]的前缀时,i是唯一确定的。一辆车可以玩多次。
【输入文件】
第一行是2个正整数n、m。
接下来n行,每行1个字符串name[i],表示第i辆车的名字。
接下来m行,每行1个字符串s,表示韵韵想要的名字。
【输出文件】
第一行输出韵韵能玩的次数。
第二行输出共有多少种可能的排列。
【输入样例】
4 4
Abcd
DeF
AAa
aBccc
Ab
AA
AbC
aBcc
【输出样例】
3
5
【数据规模和约定】
对于题目涉及到的字符串严格区分大小写,且长度小于255。
对于20%的数据 n≤10,m≤10;
对于40%的数据 n≤1000,m≤1000;
对于100%的数据 n≤10000,m≤10000。
感觉推荐系列有很多很棒的题目,这题也不错,用到很多技巧
说一下这题的得分点好了
正确的找到所有能坐的车的数目+正确的写出递推式 -> 40 (wa3 超时3)
递推式+高精处理 ->70 (超时3)
排序+二分答案 ->100
高精的话自己考前再练几题,这里就懒得说了
说一下期望得分100的做法
之前很少在字符串中用到排序+二分答案,算是学习了一下吧
我们先把所有的车的名字排序(sort大法好)
因为 题目中有说 “ 数据保证当s是name[i]的前缀时,i是唯一确定的"
这句话很重要,这说明s不可能是一个以上的名字的前缀
给我们的信息是,这题使用二分答案,而不是二分出上下界(所以要很注意题目的用词)
代码很简单:
平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i]。韵韵早就迫不及待地想玩名字是s的遥控车。可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀(也就是说能确定一个i,使s是name[i]的前缀),这时她就能玩第i辆车;或者是一个无中生有的名字,即s不是任何一辆车名字的前缀,这时候她什么也不能玩。你需要完成下面的任务:
1.韵韵想了m个她想要的名字,请告诉她能玩多少次。
2.由于管理员粗心的操作,导致每辆车的摆放位置都可能出现微小的差错,原来第i辆车现在的位置可能是i-1、i、i+1中的任意一个(第1辆车的位置不可能是0,第n辆车的位置不可能是n+1)。请你计算出共有多少种可能的排列。
注:数据保证当s是name[i]的前缀时,i是唯一确定的。一辆车可以玩多次。
【输入文件】
第一行是2个正整数n、m。
接下来n行,每行1个字符串name[i],表示第i辆车的名字。
接下来m行,每行1个字符串s,表示韵韵想要的名字。
【输出文件】
第一行输出韵韵能玩的次数。
第二行输出共有多少种可能的排列。
【输入样例】
4 4
Abcd
DeF
AAa
aBccc
Ab
AA
AbC
aBcc
【输出样例】
3
5
【数据规模和约定】
对于题目涉及到的字符串严格区分大小写,且长度小于255。
对于20%的数据 n≤10,m≤10;
对于40%的数据 n≤1000,m≤1000;
对于100%的数据 n≤10000,m≤10000。
感觉推荐系列有很多很棒的题目,这题也不错,用到很多技巧
说一下这题的得分点好了
正确的找到所有能坐的车的数目+正确的写出递推式 -> 40 (wa3 超时3)
递推式+高精处理 ->70 (超时3)
排序+二分答案 ->100
高精的话自己考前再练几题,这里就懒得说了
说一下期望得分100的做法
之前很少在字符串中用到排序+二分答案,算是学习了一下吧
我们先把所有的车的名字排序(sort大法好)
因为 题目中有说 “ 数据保证当s是name[i]的前缀时,i是唯一确定的"
这句话很重要,这说明s不可能是一个以上的名字的前缀
给我们的信息是,这题使用二分答案,而不是二分出上下界(所以要很注意题目的用词)
代码很简单:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=10001; string s[maxn],c[maxn]; int a[1001],b[1001],d[1001]; int n,m,l; long long ans=0; void jia(){ memset(d,0,sizeof(d)); int m=0; for(int i=1;i<=l+1;i++){ d[i] += a[i] + b[i] + m; m = d[i]/10; d[i] %= 10; } if(d[l+1]) l++; for(int i=1;i<=l;i++) a[i] = b[i]; for(int i=1;i<=l;i++) b[i] = d[i]; } int main(){ freopen("car.in","r",stdin); freopen("car.out","w",stdout); //freopen("data.txt","r",stdin); scanf("%d%d",&n,&m); a[1]=1;b[1]=2; l=1; for(int i=1;i<=n;i++){ cin>>s[i]; if(i>=3) jia(); } sort(s+1,s+n+1); for(int i=1;i<=m;i++){ cin>>c[i]; int l=1,r=n,mid; while(l<r){ mid=(l+r)>>1; if(c[i]<=s[mid]) r=mid; else l=mid+1; } if(s[l].find(c[i],0)==0) ans++; } cout<<ans<<"\n"; for(int i=l;i>=1;i--) cout<<d[i]; return 0; }
相关文章推荐
- noip推荐系列:汽艇[贪心]
- 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
- NOIP2011提高组 聪明的质检员(二分答案)
- NOIP2012借教室[线段树|离线 差分 二分答案]
- NOIP2015 运输计划 解题报告(二分答案+树状差分)
- bupt 204 Palindrome 求字符串任意区间的最长回文子串 二分答案+后缀数组
- 【NOIP 模拟题】[T2] 王者荣耀(二分答案+dp)
- [NOIP2011]聪明的质监员 D2 T2 二分答案
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- NOIP 2010 - 提高组 关押罪犯 二分答案+二分图的判定
- 【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
- #148. 【NOIP2015】跳石头 (二分答案,最大化最小值)
- [NOIP 模拟]穿越七色虹 二分答案
- 【二分答案+智障的字符串hash】BZOJ2946-[Poi2000]公共串(Ranklist倒一达成!!!!!)【含hash知识点】
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- 【二分答案】【分块答案】【字符串哈希】【set】bzoj2946 [Poi2000]公共串
- LA-4513 - Stammering Aliens-(hash字符串+二分答案+hash排序) 找出子串出现次数
- NOIP2015-stone(二分答案)
- NOIP2015 跳石头 解题报告(二分答案)
- noip2010 关押罪犯 二分答案+二分图判断