//这道题遇到的各种挫折花了我两天足以让我写下上千字的反思,现在终于全部通过了,简单说一下经验
/*
当输出为空、输出和预期相差十万八千里时的办法:
1、查看题目的输入,接收输入的时候是否有细节没考虑到:
有的的字符串内部可能有空,要用getline(cin,str)
2、用例不支持查看
可以打印通过输出的方法,查看不通过用例的完整输入
3、没有测试用例
考虑一些极端情况,示例里没考虑到的情况,设计用例
其他经验:
类似本题,当想重新定义一个字符串(数组)存全部小写的字符串时:
要先给strr=str;先给strr整体赋值,并且长度相等。*********************
然后调整内部的字母大小写**********************
str.find(']');此函数只返回第一个]出现的位置
*/
#include <iostream>
#include <string>
using namespace std;
string str[1001];
string text;
string strr[1001];//转为小写后的模式串数组
string textt;//转为小写后的文本串
int main() {
int num;
while(cin>>num)
{
//string kong;//第一行num后面有个换行符没接受
// getline(cin,kong);
for(int i=1;i<=num;i++)
{
cin>>str[i];
//getline(cin,str[i]);
strr[i]=str[i];//!!!!!!!
int len=str[i].size();
for(int j=0;j<len;j++)
{
if(str[i][j]>='A'&&str[i][j]<='Z')strr[i][j]=str[i][j]+32;
else
{
strr[i][j]=str[i][j];
}
}
// cout<<"str"<<i<<str[i]<<" strr"<<i<<strr[i]<<endl;////
}
cin>>text;
//getline(cin,text);
int n=text.size();
textt=text;//一定要加!!!**********************
for(int j=0;j<n;j++)
{
if(text[j]>='A'&&text[j]<='Z')
{
textt[j]=text[j]+32;
}
else{
textt[j]=text[j];
}
}
///// cout<<"text:"<<text<<" textt:"<<textt<<endl;////
for(int i=1;i<=num;i++)//对每个模式串检验
{
//文本串没有[],模式串匹配
int find=text.find("[");
if(find==string::npos&&strr[i]==textt)
{
cout<<i<<" "<<str[i]<<endl;
break;
}
//文本串有多个[]
int m=str[i].size();
int n=textt.size();
int k=0;//当前模式串的下标
int flag=1;//当前模式串匹配
int j;//文本串的下标
for( j=0;j<n;j++)//文本串的下标
{
if(textt[j]!='[')//没进入[]
{
if(strr[i][k]==textt[j])
{
k++;
flag=1;
}
else
{
flag=0;//模式串不匹配
break;
}
}
else//文本串[]内的匹配
{
j++;
while(textt[j]!=']')
{
if(strr[i][k]!=textt[j])
{
j++;
flag=0;
}
else {//匹配上了
k++;
int tmplen=n-j;
string tmp=textt.substr(j,tmplen);
j=tmp.find(']')+j;//这句话一定要有,否则每次找的都是第一个]的下标
// j=textt.find(']');
// cout<<"] at "<<j<<endl;
flag=1;///////!!!!!!!!这个一定要加
break;
}
}
if(flag==0&&textt[j]==']')//括号里都不匹配,那就对下一个模式串进行检验
{
// cout<<"括号里都不匹配"<<" ";///////////////
break;//检验下一个模式串去
}
}
}//和文本串一一校对
if(flag==1&&j==n&&k==m)//条件别漏了
{
cout<<i<<" "<<str[i]<<endl;//每个都输出
}
// else cout<<i<<" f0 "<<str[i]<<endl;
}//检验下一个模式串
}
}