2013成都区域赛题目
题意:
就是把HTML代码格式化。
1.每段文本里的单词只能以空格分割,多余的换行符,空格,tab什么的都要去掉。
2.标签不用管,原样输出。
3.这题可能一行内输入多组"<html></html>"
code:
#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <set>
#include <map>
using namespace std;
#define N 100010
#define ll long long
#define ALL(x) x.begin(),x.end()
#define CLR(x,a) memset(x,a,sizeof(x))
#define bit(st,i) ((1ll<<i)&st)
typedef pair<int,int> PI;
const int INF=0x3fffffff;
const int MOD =1000003;
const double EPS=1e-7;
string s,txt,input;
char buf[N];
const char delim[3]={32,9,10};
bool isOpen(int i,int t){
return s[i+1]!='/' && s[t-1]!='/';
}
bool isClose(int i){
return s[i+1]=='/';
}
void printTxt(int top){
char *p=strtok(&txt[0],delim);
if(p==NULL) return ;
printf("%s%s",string(top,' ').c_str(),p);
p=strtok(NULL,delim);
while(p!=NULL){
printf(" %s",p);
p=strtok(NULL,delim);
}
puts("");
}
void format(){
int dep=-1;
txt.clear();
for(int i=0;i<s.size();i++){
if(s[i]=='<'){
if(txt.size()>0){
printTxt(dep+1);
txt.clear();
}
int t=i,top;
while(s[t]!='>') t++;
if(isOpen(i,t)) top=++dep;
else if(isClose(i)) top=dep--;
else top=dep+1;
printf("%s%s\n",string(top,' ').c_str(),s.substr(i,t-i+1).c_str());
i=t;
}else txt+=s[i];
}
}
int main(){
//freopen("output.txt","w",stdout);
int re,Case=1,begin=0,end;
scanf("%d",&re);
while(gets(buf)) input+=" ", input+=buf;
for(int i=1;i<=re;i++){
end=input.find("</html>",begin)+6;
s=input.substr(begin,end-begin+1);
printf("Case #%d:\n",Case++);
format();
begin=end+1;
}
return 0;
}