#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {

  int n;

  while(cin>>n) {

    vector<string> vec;
    string input;
    int i, j, k;

    // 将n个字符串保存在vec中
    for(i=0; i<n; i++) {
      cin>>input;
      vec.push_back(input);
    }

    // 匹配字符串保存在match中
    string match;
    cin>>match;
    // 将字符串match转换为字符数组m[]
    const char *m;
    m = match.c_str();

    int x, y; // x和y记录[和]的位置
    for(i=0; i<match.size(); i++) {
      if(m[i] == '[') {
        x = i;
        continue;
      }
      if(m[i] == ']') {
        y = i;
        break;
      }
    }

    for(k=0; k<n; k++) { // 分别匹配n个字符串

      // 将需要匹配的字符串转换成字符数组q[]
      const char *q;
      q = vec[k].c_str();

      j = 0; // 对于每一个匹配字符串,j都从0开始
      int flag = 0; // 进入[]范围内,flag=1
      int mon = 0; // match,mon=1; not match,mon=0
      for(i=0; i<vec[k].size(); i++) {

        if(flag == 1 && j == y) {
          continue;
        }

        // 如果q[i]是小写字母
        if((int)q[i]>=97 && (int)q[i]<=122) {

          // 当没有匹配到'['时
          if(flag == 0) {
            // 如果这个字符匹配上了
            if((int)q[i] == (int)m[j] || (int)q[i]-32 == (int)m[j]) {
              mon = 1;
              j++;
              // 判断此时m[j]是否为'['
              if(m[j] == '[') {
                flag = 1;
                j++;
              }
              continue;
            }
            // 如果这个字符没有匹配上
            else {
              mon = 0;
              break;
            }

          }
          else { // 在[]中匹配某一个字符
            if((int)q[i] == (int)m[j] || (int)q[i]-32 == (int)m[j]) {
              flag = 0;
              j = y + 1;
              continue;
            }
            else {
              flag = 1;
              j++;
              i--;
              continue;
            }
          }
        }

        // 如果q[i]是大写字母
        else if((int)q[i]>=65 && (int)q[i]<=90) {

          // 当没有匹配到'['时
          if(flag == 0) {
            // 如果这个字符匹配上了
            if((int)q[i] == (int)m[j] || (int)q[i]+32 == (int)m[j]) {
              mon = 1;
              j++;
              // 判断此时m[j]是否为'['
              if(m[j] == '[') {
                flag = 1;
                j++;
              }
              continue;
            }
            // 如果这个字符没有匹配上
            else {
              mon = 0;
              break;
            }

          }
          else { // 在[]中匹配某一个字符
            if((int)q[i] == (int)m[j] || (int)q[i]+32 == (int)m[j]) {
              flag = 0;
              j = y + 1;
              continue;
            }
            else {
              flag = 1;
              j++;
              i--;
              continue;
            }
          }
        }

        // 如果q[i]既不是小写字母,也不是大写字母
        else {

          // 当没有匹配到'['时
          if(flag == 0) {
            // 如果这个字符匹配上了
            if((int)q[i] == (int)m[j]) {
              mon = 1;
              j++;
              // 判断此时m[j]是否为'['
              if(m[j] == '[') {
                flag = 1;
                j++;
              }
              continue;
            }
            // 如果这个字符没有匹配上
            else {
              mon = 0;
              break;
            }

          }
          else { // 在[]中匹配某一个字符
            if((int)q[i] == (int)m[j]) {
              flag = 0;
              j = y + 1;
              continue;
            }
            else {
              flag = 1;
              j++;
              i--;
              continue;
            }
          }
        }
      }
      // 如果自始至终这个字符串都匹配上了,mon=1
      if(mon == 1 && j == match.size()) {
        cout<<k+1<<" ";
        for(i=0; i<vec[k].size(); i++) {
          cout<<q[i];
        }
        cout<<endl;
      }
    }
  }
  return 0;
}

九度OJ--1165(C++)的更多相关文章

  1. 九度OJ 1165:字符串匹配 (模式匹配)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3219 解决:1149 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出 ...

  2. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  3. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  4. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

  5. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  6. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  7. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  8. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

  9. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  10. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

随机推荐

  1. Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)

    Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...

  2. HTML5之canvas基本API介绍及应用 1

    一.canvas的API: 1.颜色.样式和阴影: 2.线条样式属性和方法: 3.路径方法: 4.转换方法: 5.文本属性和方法: 6.像素操作方法和属性: 7.其他: drawImage:向画布上绘 ...

  3. Sublime Text Build 3065 License key

      Sublime Text Build 3065 License key 复制如下三个任意一个正版注册码即可 —– BEGIN LICENSE —– Andrew Weber Single User ...

  4. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

  5. Vue--- 使用vuex使用流程 1.0

    Vuex 1.安装vuex npm install  -save vuex 2. 引入 创建store文件夹目录 创建 vuex     指挥公共目录    store['state','action ...

  6. C++ string和int相互转换

    首先需要C++ 11的支持 打开devC++,点击tools,点击编译环境,然后出现的框第一个勾选,输入-std=c++11即可 然后使用 to_string() 和 atoi() 就可以轻松实现其相 ...

  7. ArrayList调用remove(int index)抛出UnsupportedOperationException问题分析以及解决记录

    使用Arrays转数组成为List后,不能调用add(...)和remove(...)方法,此时如果调用就会抛出UnsupportedOperationException异常 原因 其实Arrays. ...

  8. 十一、Linux 命令大全

    Linux 命令大全 Linux 命令大全 1.文件管理 cat chattr chgrp chmod chown cksum cmp diff diffstat file find git gitv ...

  9. Document .load与Document .ready的区别

    页面加载完成有两种事件 1.load是当页面所有资源全部加载完成后(包括DOM文档树,css文件,js文件,图片资源等),执行一个函数 问题:如果图片资源较多,加载时间较长,onload后等待执行的函 ...

  10. __name__ 和 "__main__"

    本模块名: person 调用者模块名: start import sys def funcperson(): print('我是人') print(sys.modules[__name__]) # ...