AOJ 708.序列匹配

Time Limit: 5000 ms   Memory Limit: 128 MB
Total Submission: 146   Submission Accepted: 34

Description

给定两个长度均为3的数字序列,每位上为一个范围是1-N的正整数,求有多少个仍然由3个1-N的整数构成的数字序列能与给定的两个序列中的任意一个匹配。
如果两个序列匹配,当且仅当两个序列中的每个对应数字的最近距离不超过2。
比如当N为9时,每一位数字可能是1,2,3,4,5,6,7,8,9,并且数字是循环的。也就是说9和1是相邻的。
数字之间的距离就是两个数字的位置之差。
也就是说在上面的例子中,9和1的最近距离是1,9和2的最近距离是2,2和5的最近距离是3。
比如现在给定两个序列组合为(1,2,3)和(4,5,6), (2,4,8)或者(1, N, 5) 是能和两个序列匹配中的至少一个匹配的,但是(1, 5, 6)是不能和给定的两个序列中的任何一个匹配的。

Input

多组输入,以EOF结束。
每组输入包含三行第一行为一个整数N(1 <= N <= 50),第二行和第三行都是以三个空格分隔的整数。

Output

对于每组输入,输出一个数字,表示能和给定的两个序列中的任意一个匹配的序列的个数。

Sample Input

Original Transformed
50
1 2 3
5 6 7

Sample Output

Original Transformed
249

Source

Roll

建立一个三维坐标系,把能覆盖到的地方全部标记上,然后计算数量

其中要注意小于等于0和大于N的情况(转换后还应该在0-N之间)。

 1 /*
 2 By:OhYee
 3 Github:OhYee
 4 Email:[email protected]
 5 */
 6 #include <cstdio>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <cmath>
10 #include <string>
11 #include <iostream>
12 #include <vector>
13 #include <list>
14 #include <queue>
15 #include <stack>
16 using namespace std;
17
18 #define REP(n) for(int o=0;o<n;o++)
19
20 const int maxn = 55;
21
22
23 bool Do() {
24     int N,a1,b1,c1,a2,b2,c2;
25     int cnt = 0;
26     if(scanf("%d%d%d%d%d%d%d",&N,&a1,&b1,&c1,&a2,&b2,&c2) == EOF)
27         return false;
28
29     bool map[maxn][maxn][maxn] = {0};
30
31     for(int x = a1 - 2;x <= a1 + 2;x++)
32         for(int y = b1 - 2;y <= b1 + 2;y++)
33             for(int z = c1 - 2;z <= c1 + 2;z++) {
34                 int xx = x <= 0 ? N + x : x > N ? x - N : x;
35                 int yy = y <= 0 ? N + y : y > N ? y - N : y;
36                 int zz = z <= 0 ? N + z : z > N ? z - N : z;
37                 if(!map[xx][yy][zz] && xx > 0 && xx <= N&&yy > 0 && yy <= N&&zz > 0 && zz <= N)
38                     cnt++;
39                 map[xx][yy][zz] = 1;
40             }
41     for(int x = a2 - 2;x <= a2 + 2;x++)
42         for(int y = b2 - 2;y <= b2 + 2;y++)
43             for(int z = c2 - 2;z <= c2 + 2;z++) {
44                 int xx = x <= 0 ? N + x : x > N ? x - N : x;
45                 int yy = y <= 0 ? N + y : y > N ? y - N : y;
46                 int zz = z <= 0 ? N + z : z > N ? z - N : z;
47                 if(!map[xx][yy][zz] && xx > 0 && xx <= N&&yy > 0 && yy <= N&&zz > 0 && zz <= N)
48                     cnt++;
49             }
50     printf("%d\n",cnt);
51     return true;
52 }
53
54
55 int main() {
56     while(Do());
57     return 0;
58 }
时间: 2024-10-20 01:11:45

AOJ 708.序列匹配的相关文章

Scala匹配模式-----序列匹配

鉴于用Scala 工作通常意味着和序列打交道,要是能和列表.数组的长度和内容来匹配岂不美哉?下面的例子就做到了,它测试了两个列表来检查它们是否包含4个元素,并且第二个元素是3. // code-examples/Rounding/match-seq-script.scala val willWork = List(1, 3, 23, 90) val willNotWork = List(4, 18, 52) val empty = List() for (l <- List(willWork,

codeforce 338 C 巧妙处理序列匹配问题

这道题就是给你两个序列A,和B, 然后问你求出一个用最少的Ade子序列组成B的方法..例如A = abc B = abccba, 那么就可以用两个A表示B, 一个是正的序列, 另外一个是负的序列.对于这个问题我们先做一个小小的转换,我们将A倒置变为A1,然后就是用递增的A和A1序列表示B,我们用dp[2][i][j]表示从A(A1)[i],B[j]开始最长一致序列的长度, 然后求解答案的时候可以使用贪心的方法解决,具体详见代码: #include <cstdio> #include <a

实用正则表达式匹配和替换

正则表达式非常有用,查找.匹配.处理字符串.替换和转换字符串,输入输出等.而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式.下面整理一些常用的正则表达式. 字符与描述 \ : 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 &quo

algorithm之不变序列操作

概述:不变序列算法,参见http://www.cplusplus.com/reference/algorithm/ /* std::for_each template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Function fn); Apply function to range Applies function fn to each o

扩增子分析解读4去嵌合体 非细菌序列 生成代表性序列和OTU表

本节课程,需要先完成 扩增子分析解读1质控 实验设计 双端序列合并 2提取barcode 质控及样品拆分 切除扩增引物 3格式转换 去冗余 聚类 先看一下扩增子分析的整体流程,从下向上逐层分析 分析前准备 # 进入工作目录 cd example_PE250 上一节回顾:我们制作了Usearch要求格式的Fasta文件,对所有序列进行去冗余和低丰度过滤,并聚类生成了OTU. 接下来我们对OTU进一步去除嵌合体,并生成代表性序列和OTU表. 什么是chimeras(嵌合体)? 嵌合体序列由来自两条或

正则表达式匹配号码

因为项目中要匹配手机号,所以接触了正则表达式,没有深入学习,直说明一个简单的应用. 在java里,匹配要用matches(表达式字符串)方法. 表达式要以^开头,以$结尾. 下面是基本语法表: 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.例如,"n"匹配字符"n"."\n"匹配换行符.序列"\\"匹配"\","\("匹配"(". ^ 匹配输

正則表達式匹配号码

由于项目中要匹配手机号.所以接触了正則表達式,没有深入学习,直说明一个简单的应用. 在java里,匹配要用matches(表达式字符串)方法. 表达式要以^开头,以$结尾. 以下是基本的语法表: 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符. 比如,"n"匹配字符"n"."\n"匹配换行符.序列"\\"匹配"\"."\("匹配"(". ^ 匹

R语言︱情感分析文本操作技巧汇总(打标签、词典与数据匹配等)

笔者寄语:情感分析中对文本处理的数据的小技巧要求比较高,笔者在学习时候会为一些小技巧感到头疼不已. 主要包括以下内容: 1.批量读取txt字符文件(导入.文本内容逐行读取.加入文档名字). 2.文本清洗(一级清洗,去标点:二级清洗去内容:三级清洗,去停用词) 3.词典之间匹配(有主键join.词库匹配%in%) 4.分词之后档案id+label的加入 5.情感打分(关联情感词join.情感分数aggerate.情感偏向) -------------------------------------

php 常用 正则 表达式 匹配 符号 解释

常用正则表达式全部符号解释 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(". ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置. $ 匹配输入字符串的结束位置.如果设置了