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<<"\n";
	for(int i=l;i>=1;i--) cout<<d[i];
	return 0;
}

  

时间: 2024-10-12 23:37:21

noip推荐系列:遥控车[字符串+高精+二分答案]的相关文章

noip推荐系列:汽艇[贪心]

[问题背景] 一天sxc,zsx,wl到gly坐汽艇,本来和其他的人约好了一起去,结果被放了鸽子,3人便只有一人负担x元去坐汽艇(很贵哦).坐了才发现如果汽艇上人多了位置就不宽敞,就不好玩了.而3个人貌似是最好玩的,但究竟是不是呢? [问题描述]  假设有n个人要去坐1个汽艇,每个人单独坐汽艇的快乐程度是Ci,每多一个人,他的快乐程度会减去Di,请求出使快乐程度之和达到最大的方案.(假设汽艇的容量足够大). [文件输入] 输入文件共有3行:  第1行是一个整数n:  第2行有n个整数,依次表示每

vijos P1375 大整数(高精不熟的一定要做!)

/* 我尼玛这题不想说啥了 亏了高精写的熟..... 加减乘除max都写了 高精二分 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1010 #define memcpy(a,b); for(int i=0;i<=1000;i++)a[i]=b[i]; using namespace std; int n[maxn],len,l[maxn],r[maxn],mid[max

模板——高精系列

存放一下高精的模板 高精加: #include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int a[1001],b[1001],c[1001],lena,lenb; char a1[1001],b1[1001]; int main(){ gets(a1); gets(b1); lena=strlen(a1); lenb=strlen

[DP][高精][NOIP]Hanoi双塔问题

题目梗概 Hanoi塔问题的基础上,每种圆盘加了一个.实际内容并没有变化. 思考 首先来一波Hanoi问题的步数公式推导: 首先n个不同的圆盘. 只有把n-1个圆盘从a->b,最后把a上剩余的一个圆盘从a->c. 之后把b上的n-1个圆盘从b->c. 这里的两步:把n-1个圆盘从a->c,和n-1个圆盘从b->c.所需要的步骤数.实际上就是把n-1个圆盘从a移动到c的步骤数*2,因为是等价的.从a->b和从b->c移动的圆盘个数都是一样的,所以步数就是 (n-1)

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

[贪心][高精]P1080 国王游戏(整合)

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少.注意,国

tyvj P4751 NOIP春季系列课程 H&#39;s Problem

-H's Problem- 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学,DDL越来越多了,她不能一直都处于逛街的状态.为了让自己能够更加沉迷于学习,她规定一次逛街只逛T个单位的时间. 小H从1号店出发,从1号店走到第i号店需要花费ai的时间,这些店形成了一条直线,也就是说小H从第i号店走到第i+1号店需要花费的时间为a{i+1}-ai.若小H选择了第i号店并且进去逛,则会消耗bi的时间.对于第i家店,小H都对它有自己的看法.具体地,可以用ci来表示小H是否喜欢这家店.如果ci=1,则表示

codevs 3119 高精度练习之大整数开根 (各种高精+压位)

/* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms 测试点#2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms 测试点#3.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms 测试点#4.in 结果:AC 内存使用量: 256kB 时间使用量: 10ms 测试点#5.in 结果:AC 内

各种高精——一入高精深似海,从此AC是路人.

1.高精简单操作 题面 https://www.luogu.org/problemnew/show/P2152 代码 https://www.luogu.org/record/show?rid=5655289 高精,GCD,stein. 即 gcd(a,b)=2*gcd(a/2,b/2); gcd(a,b)=gcd(a/2,b); gcd(a,b)=gcd(a,b/2); 再用辗转相减套个高精就好 2.高精除int 题面 https://www.luogu.org/problemnew/show