如果在线处理退格的操作会显得复杂,所以直接离线,在读入的时候直接退好格,再扫一遍全文比对即可!
注意一些细节以及坑人的数据:输入也有退格(辣鸡打字练习应用,样例文本都能错 (╯▔皿▔)╯)
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int M=1e5+10; const int N=1e6+10; int cnt1,cnt2,ans,tot,num=1,num2=1,hang; int nxt[M],nxt2[M]; char out[N],in[N]; int Read(){ int x=0; char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x; } int main(){ in[++cnt1]=getchar(); while(in[cnt1]!='E'){ if(in[cnt1]=='\n') nxt[++num]=cnt1; if(in[cnt1]=='<') cnt1=max(nxt[num],cnt1-2); in[++cnt1]=getchar(); } getchar(),getchar(),getchar(); out[++cnt2]=getchar(); while(out[cnt2]!='E'){ if(out[cnt2]=='\n') nxt2[++num2]=cnt2; if(out[cnt2]=='<') cnt2=max(nxt2[num2],cnt2-2); out[++cnt2]=getchar(); } cnt1=cnt2=num=num2=1; while(in[cnt1]!='E'&&out[cnt2]!='E'){ char ch1=in[cnt1],ch2=out[cnt2]; if(ch1=='\n'||ch2=='\n') num++,cnt1=nxt[num],cnt2=nxt2[num]; else if(ch1==ch2) if(ch1!='\n') ans++; cnt1++,cnt2++; } tot=Read(); printf("%0.f\n",(double)ans/(tot/60.0)); return 0; }