题目直达
一开始写了一份代码只有20分,苦思冥想原想很久也不知道哪里错了,后来发现是↓
cin>> //会忽略换行符
getchar() //会读入换行符
这个知识点弄错了,第一行的内容少了一个字母。虽然能过了题目给的例子,但是最后gg
修改后的代码如下:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
struct node{
string tap;
string id;
int pre;
};
node nodes[110];
int n,m;
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
char a;
a=cin.get();
//原来这里写的是cin>>,后来为了禁用c语言兼容(后面超时了,想快点),把getchar()换了
string buff;
for(int k=1;k<=n;k++){
getline(cin,buff);
int pre=0;
for(int i=0;i<buff.size() ;i++){
if(buff[i]=='.') pre++;
else break;
}
string tap;
int i=pre;
for(;i<buff.size() ;i++){
if(buff[i]==' ') break;
if(buff[i]>='A'&&buff[i]<='Z'){
tap+=buff[i]-'A'+'a';
}
else tap+=buff[i];
}
if(i==buff.size() ){
nodes[k]=(node){tap,"",pre};
}
else{
string id="";
for(int j=i+2;j<buff.size() ;j++){
id+=buff[j];
}
nodes[k]=(node){tap,'#'+id,pre};
}
}
vector<string> search;
for(int k=0;k<m;k++){
search.clear() ;
getline(cin,buff);
string tmp="";
bool flag=0;
for(int i=0;i<buff.size() ;i++){
if(buff[i]==' '){
search.push_back(tmp);
tmp.clear() ;
flag=0;
continue;
}
else if(buff[i]=='#'){
flag=1;
}
if(flag==0&&buff[i]>='A'&&buff[i]<='Z'){
tmp+=buff[i]-'A'+'a';
}
else tmp+=buff[i];
if(i==buff.size() -1) search.push_back(tmp);
}
vector<int > ans;
ans.clear() ;
if(search.size() ==1){
for(int i=1;i<=n;i++){
if(nodes[i].id ==search[0]||nodes[i].tap ==search[0]){
ans.push_back(i);
}
}
}
else{
int M=0;
int level=1;
int i=0;
for(;i<search.size() -1;i++){
while(1){
if(nodes[level].id !=search[i]&&nodes[level].tap !=search[i]) level++;
else {
if(M<nodes[level].pre){
M=nodes[level].pre;
level++;
break;
}
}
}
}
int size=search.size() ;
if(i<size){
for(;level<=n;level++){
if(nodes[level].id==search[size-1]||nodes[level].tap ==search[size-1])
ans.push_back(level);
}
}
}
cout<<ans.size()<<" ";
for(int i=0;i<ans.size() ;i++){
cout<<ans[i]<<" ";
}
cout<<"\n";
}
return 0;
}
/*
11 5
html
..head
....title
..body
....h1
....p #substitle
....div #main
......h2
......p #one
......div
........p #two
p
#substitle
h3
div p
div div p
11 5
html
..head
....title
..body
....h1
....P #suBstitle
....div #main
......h2
......p #one
......div
........p #two
P
#two
h3
div p
div div #two
*/
上面的代码只有50分,现在还不清楚超时的原因,下面的代码是满分的:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
struct node{
string tap;
string id;
int pre;
};
node nodes[110];
int n,m;
int main(){
cin>>n>>m;
char c;
c=getchar();;
string buff;
for(int k=1;k<=n;k++){
getline(cin,buff);
int pre=0;
for(int i=0;i<buff.size() ;i++){
if(buff[i]=='.') pre++;
else break;
}
string tap;
int i=pre;
for(;i<buff.size() ;i++){
if(buff[i]==' ') break;
if(buff[i]>='A'&&buff[i]<='Z'){
tap+=buff[i]-'A'+'a';
}
else tap+=buff[i];
}
if(i==buff.size() ){
nodes[k]=(node){tap,"",pre};
}
else{
string id="";
for(int j=i+2;j<buff.size() ;j++){
id+=buff[j];
}
nodes[k]=(node){tap,'#'+id,pre};
}
}
vector<string> search;
for(int k=0;k<m;k++){
while(!search.empty() ) search.pop_back() ;
getline(cin,buff);
string tmp="";
bool flag=0;
for(int i=0;i<buff.size() ;i++){
if(buff[i]==' '){
search.push_back(tmp);
tmp.clear() ;
flag=0;
continue;
}
else if(buff[i]=='#'){
flag=1;
}
if(flag==0&&buff[i]>='A'&&buff[i]<='Z'){
tmp+=buff[i]-'A'+'a';
}
else tmp+=buff[i];
if(i==buff.size() -1) search.push_back(tmp);
}
vector<int > ans;
ans.clear() ;
if(search.size() ==1){
for(int i=1;i<=n;i++){
if(nodes[i].id ==search[0]||nodes[i].tap ==search[0]){
ans.push_back(i);
}
}
}
else{
int size=search.size() ;
vector<int > p;
vector<int> order;
p.clear() ;
order.clear() ;
for(int i=1;i<=n;i++){
if(nodes[i].id ==search[size-1]||nodes[i].tap ==search[size-1]){
p.push_back(nodes[i].pre );
order.push_back(i);
}
}
for(int i=0;i<p.size() ;i++){
int s=0;
for(int j=1;j<order[i];j++){
if(nodes[j].pre<p[i]){
if(search[s]==nodes[j].id ||search[s]==nodes[j].tap ){
s++;
if(s==size-1) break;
}
}
}
if(s==size-1) ans.push_back(order[i]);
}
}
cout<<ans.size()<<" ";
for(int i=0;i<ans.size() ;i++){
cout<<ans[i]<<" ";
}
cout<<"\n";
}
return 0;
}
下面是提交记录,我感觉第二版代码更容易超时,但是不知道为什么会这样。而且这个用时0ms也太迷了吧?