2754: [SCOI2012]喵星球上的点名

2023-11-22 16:10
文章标签 星球 点名 2754 scoi2012

本文主要是介绍2754: [SCOI2012]喵星球上的点名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

a180285幸运地被选做了地球到喵星球的留学生。他发现喵星人在上课前的点名现象非常有趣。   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成。喵星球上的老师会选择M个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那么这个喵星人就必须答到。 然而,由于喵星人的字码过于古怪,以至于不能用ASCII码来表示。为了方便描述,a180285决定用数串来表示喵星人的名字。
现在你能帮助a180285统计每次点名的时候有多少喵星人答到,以及M次点名结束后每个喵星人答到多少次吗?  

Input

现在定义喵星球上的字符串给定方法:
先给出一个正整数L,表示字符串的长度,接下来L个整数表示字符串的每个字符。
输入的第一行是两个整数N和M。
接下来有N行,每行包含第i 个喵星人的姓和名两个串。姓和名都是标准的喵星球上的
字符串。
接下来有M行,每行包含一个喵星球上的字符串,表示老师点名的串。

Output

对于每个老师点名的串输出有多少个喵星人应该答到。
然后在最后一行输出每个喵星人被点到多少次。

Sample Input

2 3
6 8 25 0 24 14 8 6 18 0 10 20 24 0
7 14 17 8 7 0 17 0 5 8 25 0 24 0
4 8 25 0 24
4 7 0 17 0
4 17 0 8 25

Sample Output


2
1
0
1 2
【提示】
事实上样例给出的数据如果翻译成地球上的语言可以这样来看
2 3
izayoi sakuya
orihara izaya
izay
hara
raiz

HINT

 



【数据范围】 

 对于30%的数据,保证: 

1<=N,M<=1000,喵星人的名字总长不超过4000,点名串的总长不超过2000。

对于100%的数据,保证:

1<=N<=20000,1<=M<=50000,喵星人的名字总长和点名串的总长分别不超过100000,保证喵星人的字符串中作为字符存在的数不超过10000。

和3172有点类似,也是用AC自动机建立fail树然后在fail树上统计答案。。。
  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<algorithm>
  7 #include<string>
  8 #include<map>
  9 #include<queue>
 10 #include<vector>
 11 #include<set>
 12 #define inf 1000000000
 13 #define maxn 100000+5
 14 #define maxm 50000+5
 15 #define eps 1e-10
 16 #define ll long long
 17 #define for0(i,n) for(int i=0;i<(n);i++)
 18 #define for1(i,n) for(int i=1;i<=(n);i++)
 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 22 using namespace std;
 23 int read(){
 24     int x=0,f=1;char ch=getchar();
 25     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 26     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 27     return x*f;
 28 }
 29 int n,m,ans1[maxn],ans2[maxn];
 30 vector<int> a[20005],st[maxn],V,M;
 31 map<int,int> next[maxn];
 32 bool v[maxn],mark[maxm];
 33 struct acm{
 34     int tot,ans;
 35     int fail[maxn],q[maxn];
 36     acm(){
 37         tot=1;
 38         for(int i=-1;i<=10000;i++)
 39             next[0][i]=1;
 40         fail[1]=0;
 41     }
 42     void insert(int pos){
 43         int now=1,L=read();
 44         for1(i,L){
 45             int x=read();
 46             if(!next[now][x])next[now][x]=++tot;
 47             now=next[now][x];
 48         }
 49         st[now].push_back(pos); 
 50     }
 51     void build(){
 52         int head=0,tail=1;
 53         q[0]=1;
 54         while(head!=tail){
 55             int now=q[head];head++;
 56             for(map<int,int>::iterator i=next[now].begin();i!=next[now].end();i++){
 57                 int t=i->first,k=fail[now];
 58                 while(!next[k][t])k=fail[k];
 59                 fail[i->second]=next[k][t];
 60                 q[tail++]=i->second;
 61             }
 62         }
 63     }
 64     void get(int pos,int x){
 65         for(int i=x;i;i=fail[i])
 66             if(!v[i]){
 67                 v[i]=1;V.push_back(i);
 68                 for(int j=0;j<st[i].size();j++)
 69                     if(!mark[st[i][j]]){
 70                         mark[st[i][j]]=1;M.push_back(st[i][j]);
 71                         ans1[st[i][j]]++;
 72                         ans2[pos]++;
 73                     }
 74             }
 75             else break;
 76     }
 77     void solve(int x){
 78         int now=1;
 79         for0(i,a[x].size()){
 80             int t=a[x][i];
 81             while(!next[now][t])now=fail[now];
 82             now=next[now][t];get(x,now);
 83         }
 84         for0(i,V.size())v[V[i]]=0;
 85         for0(i,M.size())mark[M[i]]=0;
 86         V.clear();M.clear();
 87     }
 88 }acm;
 89 int main(){
 90     //freopen("input.txt","r",stdin);
 91     //freopen("output.txt","w",stdout);
 92     n=read();m=read();
 93     int L,x;
 94     for1(i,n){
 95         L=read(),x;
 96         while(L--)x=read(),a[i].push_back(x);
 97         a[i].push_back(-1);
 98         L=read();
 99         while(L--)x=read(),a[i].push_back(x);
100     }
101     for1(i,m)
102         acm.insert(i);
103     acm.build();
104     for1(i,n)
105         acm.solve(i);
106     for1(i,m)printf("%d\n",ans1[i]);
107     for1(i,n){
108         printf("%d",ans2[i]);
109         if(i!=n)printf(" ");
110     }
111     return 0;
112 }
View Code

 

转载于:https://www.cnblogs.com/htwx/articles/5551960.html

这篇关于2754: [SCOI2012]喵星球上的点名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411331

相关文章

IO练习--随机点名

随机点名器1 需求: 有一个文件里面存储了班级同学的信息,每一个信息占一行。 格式为:张三-男-23 要求通过程序实现随机点名器。 运行效果: 第一次运行程序:随机同学姓名1(只显示名字) 第二次运行程序:随机同学姓名2(只显示名字) 第三次运行程序:随机同学姓名3(只显示名字)  public class Tset {public static void main(String[] args

点名2.0版本

#使用说明:1,桌面上有71班学生名单.xlsx和72班学生名单.xlsx或者按照需求,放您想要的两个文件2,修改代码内部文件名称3,pyinstalLer库压缩4点开压缩后的exe文件运行#使用前先下载pyinstall库压缩,压缩的代码pyinstall -w -F -i "图片的绝对路径" "python的绝对路径"压缩后寻找dist文件中的python文件名.py打开exe

关于我的生信笔记开通《知识星球》

关于知识星球 1. 为什么到现在才开通《知识星球》 从很早关注我的同学应该了解小杜的知识分享历程,小杜是从2021年11月底开始进入此“坑”,一直坚持到现在,马上3年了(24年11月底到期)。自己也从一个小青年,变成一个大青年。也许后面,会一直更新下去,但是也许我某一天突然间就停止了(PS:事事难料啊)。 你说分享3年的时间长或是不长呢? 说长,对的。 谁又有几个3年的时间一直投入这件

JavaScript_9_练习:随机点名

效果图 代码 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>练习:随机点名</title><style>div {margin: 50px auto;width:

百老开通知识星球啦,数据要素、数据治理等资料迅速扩散!

1.写在前面: 做数据相关工作有一些年头了,手里也积攒了几千份案例、解决方案、考试认证资料、数据要素研报等材料,形成自我的架构参考库,按TOGAF开发方法,分别形成标准信息库(Standards Information Base)、参考库(Reference Library)、架构情景库等。使得工作效率事半功倍。搞个星球,是希望跟各位分享架构参考库,希望帮助到各位! 按分类形成企业连续

【快乐星球game】

编写游戏程序代码是一个复杂的过程,涉及到游戏设计、编程、图形设计、音效制作等多个方面。以下是一个非常简化的示例,用于展示如何开始编写一个基本的游戏程序。我们将使用Python语言和一个名为Pygame的库来创建一个简单的游戏。 首先,确保你已经安装了Python和Pygame。你可以通过运行以下命令来安装Pygame: pip install pygame 然后,我们可以编写一个简单的游戏程

B进制星球(洛谷-P1604)

题目描述 话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数。星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。 输入输出格式 输入格式: 共3行第1行:一个十进制的整数,表示进制B。第2-3行:每行一

处女座点名

【题目描述】 处女座觉得自己手上的经费可能不太够,于是决定给牛逼学生们带家教。 一天他去上课用自己的火眼金睛感觉教室里有一个学生没有来,于是他就叫学生们报出自己的学号。 已知这个班上的学号是从1开始连续编号的,处女座告诉你这个班上有多少人,想问问你到底是谁没有来。 【输入描述】 输入数据共两行,第一行为一个整数N,表示班上的学生数量。 第二行为一行N-1个整数,表示已经来的学生的学号,按升序给出

【three.js案例一】智慧星球

直接附上源码: import * as THREE from 'three';import { OrbitControls } from 'three/addons/controls/OrbitControls.js';//场景const scene = new THREE.Scene();const geometry = new THREE.SphereGeometry(50,32,1

7-4 排队点名

小X和他的同学们正在上体育课,一共有n位学生编号为1~n,他们已经在操场上排成了一列,这个时候体育老师来了,他觉得他们排成的队伍存在着一些瑕疵,于是按顺序进行了m次点名: 每次点名会点到一个编号为bi的学生,于是这名学生就会出列并站到队伍的最前面(即最左端),原本在编号为bi前的学生会自动后退一个位置。然后在移动好的队伍上进行下一次点名。 现在,给定初始队列和m次点名的编号,小X想知道点完名后