• 遥控车(洛谷 2030)


    题目描述

    平平带着韵韵来到了游乐园,看到了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,表示韵韵想要的名字。

    输出格式:

    第一行输出韵韵能玩的次数。第二行输出共有多少种可能的排列。

    输入输出样例

    输入样例#1:
    4 4
    Abcd
    DeF
    AAa
    aBccc
    Ab
    AA
    AbC
    aBcc
    输出样例#1:
    3
    5
    

    说明

    【注意】

    对于题目涉及到的字符串严格区分大小写,且长度小于255。

    【数据范围】

    对于20%的数据 n≤10,m≤10;

    对于40%的数据 n≤1000,m≤1000;

    对于100%的数据 n≤10000,m≤10000。

    /*
      第一问要求我们在n个字符串中找到以c为前缀的字符串,不难发现,把n个字符串排序后是满足单调性的,可以二分查询。第二问是斐波那契数列,不过要用高精度做。 
    */
    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #define N 10010
    using namespace std;
    string s[N];
    int a[N],b[N],ans[N],la=1,lb=1;
    int main()
    {
        int n,m,tot=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          cin>>s[i];
        sort(s+1,s+n+1);
        for(int i=1;i<=m;i++)
        {
            string c;cin>>c;
            int l=1,r=n;
            while(l<=r)
            {
                int mid=(l+r)/2;
                if(s[mid]<c)l=mid+1;
                else r=mid-1;
            }
            if(s[l].find(c,0)==0)tot++;
        }
        printf("%d
    ",tot);
        if(n<=2)
        {
            printf("%d",n);
            return 0;
        }
        a[1]=1;b[1]=2;
        for(int i=3;i<=n;i++)
        {
            memset(ans,0,sizeof(ans));
            int lc=max(la,lb);
            for(int j=1;j<=lc;j++)
            {
                ans[j]+=a[j]+b[j];
                ans[j+1]+=ans[j]/10;
                ans[j]%=10;
            }
            if(ans[lc+1])lc++;
            la=lb;for(int j=1;j<=la;j++)a[j]=b[j];
            lb=lc;for(int j=1;j<=lb;j++)b[j]=ans[j];
        }
        for(int i=lb;i>=1;i--)printf("%d",b[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    2016701010126 2016-2017-2《java程序设计》集合
    201671010126 2016-2017-2《Java程序设计》第六周
    201671010126 2016-2017-2《Java程序设计》总结
    201671010128 2017-12-17《Java程序设计》之并发
    201671010128 2017-11-10《Java程序设计》之应用程序部署(2)
    201671010128 2017-11-29《Java程序设计》之应用程序部署
    201671010128 2017-11-29《Java程序设计》之Swing用户界面组件
    201671010128 2017-11-19《Java程序设计》之事件处理技术
    201671010128 2017-11-12《Java程序设计》之图形程序设计
    201671010128 2017-11-05《Java程序设计》之集合
  • 原文地址:https://www.cnblogs.com/harden/p/5826992.html
Copyright © 2020-2023  润新知