zoukankan      html  css  js  c++  java
  • noip推荐系列:遥控车[字符串+高精+二分答案]

    【问题描述】

    平平带着韵韵来到了游乐园,看到了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<<"
    ";
    	for(int i=l;i>=1;i--) cout<<d[i];
    	return 0;
    }
    

      

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/polebug/p/4075363.html
Copyright © 2011-2022 走看看