题解 CF8A 【Train and Peter】

LuckyCloud

2018-05-16 17:18:30

Solution

## 内心OS **~~莫名感觉自己的代码简单易懂~~**翻了那么多CF的题解Pascal貌似很少,~~想当初学pascal的时候还是小学生~~那就来一波简单粗暴的代码吧,Pascal的字符串函数真的蛮好用的。 ------------ ## 正经题解 Pos求出S1在S2中的起始位置,如果S1在S2中不存在的话,就返回0。 按照题目意思,我们就先设第一次醒着的时候看到的彩旗序列为Q1,总彩旗序列为S1,第二次醒着看到的彩旗序列设为Q2,然后直接调用Pos函数找到第一次看到Q1的位置,接着调用delete函数删除从S1起始位置一直到Q1末端位置的所有彩旗,这样当我们调用Pos函数查找Q2的出现位置的时候,**就可以保证Q2一定出现在Q1后面并且Q1和Q2没有交集** ------------ ## 补充 ###### 什么叫没有交集?请看这个例子 ###### Luckycloudisextremlyjuruo ###### Luckycloudis ###### is ###### 如果算法中不删除从S1起始位置一直到Q1末端位置的所有彩旗 ###### Q1的出现位置就是1( _L_ uckycloudis) ,Q2的出现位置就是11(Luckycloud _i_ s) ###### 显然这样是错误的因为Q1和Q2有交集。 ## 思考题 以上介绍的是从A到B站的做饭,至于从B到A站的做法,一模一样,~~我就不赘述了~~我觉得我已经写的很仔细了QAQ ------------ ```pascal var s,p1,p2,mid:ansistring; lens,lenp1,lenp2,flag:longint; i,j,k,l,n,m:longint; begin readln(s); mid:=s; readln(p1); lenp1:=length(p1); readln(p2); lenp2:=length(p2); n:=pos(p1,mid); delete(mid,1,n+lenp1-1); m:=pos(p2,mid); if (m>0)and(n>0) then flag:=flag+1; lens:=length(s); mid:=s; for i:=1 to lens do mid[i]:=s[lens-i+1]; n:=pos(p1,mid); delete(mid,1,n+lenp1-1); m:=pos(p2,mid); if (m>0)and(n>0) then flag:=flag+2; if flag=3 then writeln('both'); if flag=1 then writeln('forward'); if flag=2 then writeln('backward'); if flag=0 then writeln('fantasy'); end. ```