• 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;
    }
    

      

  • 相关阅读:
    mysqladmin
    Android project structure in Eclipse
    Android System Architecture
    The Origins of Data Mining
    Ubuntu 12.04 ‘can not lock /etc/shadow try again later’
    20122013QS计算机专业世界大学排名
    What is Data Mining
    HOW to login MYSQL, Help, and Select Database
    C++函数指针与C#委托之间有何联系
    How to download codes from Google Code
  • 原文地址:https://www.cnblogs.com/polebug/p/4075363.html
Copyright © 2020-2023  润新知