题目





总结与思考
这一道经典模拟题,对于模拟题,尤其是长度较长的模拟题,一定要仔细读题,把每一个细节都照顾到,这个代码刚开始交了很多遍都是90,后来才发现题目中在查询的时候 #后面的字符大小心敏感,而我都按照不敏感处理;另外,由于代码中有较多的for循环,一定要注意内侧for循环的索引值不能与外侧索引值相同,容易发生一些奇怪的错误。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,m;
char ch;
struct node{
string label;
string id;
int l;
}a[109];
vector<string> demands;
void split_(string c,vector<string>&v)
{
v.clear();
int last=0;
for(int t=0;t<c.length();t++)
{
if(c[t]==' ')
{
v.push_back(c.substr(last,t-last));
last=t+1;
}
}
v.push_back(c.substr(last,c.length()-last));
}
int main()
{
freopen("a.txt","r",stdin);
cin>>n>>m;
getchar();
for(int i=0;i<n;i++)
{
int tcnt=0;
bool flag=false;
while((ch=getchar())!='\n')
{
if(ch=='#'){
string _tt;
cin>>_tt;getchar();
a[i].label=ch+_tt;
break;
}
else if(ch=='.') tcnt++;
else
{
a[i].id+=tolower(ch);
while((ch=getchar())!=' ')
{
if(ch=='\n')
{
flag=true;
break;
}
a[i].id+=tolower(ch);
}
}
if(flag) break;
}
a[i].l=tcnt/2;
}
for(int i=0;i<m;i++)
{
string com;
vector<int> ans;
getline(cin,com);
split_(com,demands);
for(int j=0;j<demands.size();j++)
{
if(demands[j][0]=='#') continue;
for(int k=0;k<demands[j].length();k++)
demands[j][k]=tolower(demands[j][k]);
}
if(demands.size()==1)
{
for(int k=0;k<n;k++)
{
if(a[k].id==demands[0] || a[k].label==demands[0])
ans.push_back(k);
}
}
else
{
for(int k=0;k<n;k++)
{
int len=demands.size()-1;
if(a[k].label==demands[len] || a[k].id==demands[len])
{
len--;
for(int j=k-1;j>=0&&a[j].l<=a[k].l;j--)
{
if(a[j].l<a[k].l)
{
if(a[j].label==demands[len] || a[j].id==demands[len])
{
len--;
if(len==-1) break;
}
}
}
}
if(len==-1) ans.push_back(k);
}
}
cout<<ans.size()<<" ";
for(int y=0;y<ans.size();y++) cout<<ans[y]+1<<" ";
cout<<endl;
}
return 0;
}
本文深入解析了一道经典模拟题的解题思路与代码实现,强调了读题细致、处理字符串大小写敏感性和避免索引冲突的重要性。通过具体代码示例,分享了在解决长模拟题时容易忽视的细节,如查询时对#号后字符的敏感处理及多层循环中索引的正确使用。
372

被折叠的 条评论
为什么被折叠?



