PTA 接话茬

344 阅读2分钟

小CC最喜欢的就是接话茬,别人说一句,小CC就会接着他的话尾巴继续说下去,然后告诉他这是“顶针”修辞手法,活活将人气死。小XX也喜欢接话茬,每天都要与小CC比较技艺。然而无论是谁,都会被他们活活气死,因此两人总是难决胜负。后来小CC和小XX一起上了厦门大学,学习了校选课《接话茬数学原理与杠精的自我修养》,他们决定对两人的接话茬水平进行定量评估。

他们约定比赛规则如下,随机找一个倒霉的路人,路人说一句话,他们一起来接,他们接的话的前缀可以作为路人说的话后缀的长度就是那句话的水平。比如,别人说“abbbaabbc”,小CC接了一句“abbcefagd”,他所说的话的前缀“abbc”正是路人所说的话的后缀,长度为4,那么小CC的水平就是4;如果小XX说的是“xbbcadf”,无法构成路人所说的话的后缀,因此水平只有0。

现在,他们的比赛正式开始,由你来写一个程序充当裁判。

输入格式:

共三行,每行是一句话,长度均不超过106。

第一行是路人说的话。第二行是小CC说的话。第三行是小XX说的话。

输出格式:

仅一行,输出小CC和小XX接的话的水平,以空格分割,行末没有多余空格,以换行结束。

输入样例:

abbaabbc
abbc
xbb
结尾无空行

输出样例:

4 0
结尾无空行

代码:

# include <iostream>
using namespace  std;

int find(string s , string p)
{
    int l1 = s.size();
    int l2 = p.size();

    for(int i = l2 - 1; i >= 0 ; )
    {
        if(s[l1-1] != p[i])
            i--;
        else
        {
            int j = i ,k = l1-1 ;
            while( j >= 0)
            {
                if(s[k] == p[j])
                {
                    j--;
                    k--;
                    if(j >= 0 && k < 0 )
                    {
                        i--;
                        break;
                    }
                }
                else
                {
                    i--;
                    break;
                }
            }
            if( j == -1)
                return i+1;
        }
    }
    return 0;
}

int main()
{
    string s;
    string s1 ,s2 ;
    getline(cin ,s);
    getline(cin ,s1);
    getline(cin ,s2);
    int l1 = find(s, s1);
    int l2 = find(s,s2);
    cout << l1 << ' ' << l2 << endl;
    return 0;
}

提交结果:

5.png