CF39J题解

· · 题解

思路

我们暂时称“第一字符”为第一个 s1 与 s2 对应不相等等的字符(如样例一:为 d ;样例三:为 m )

因为题目中说只会删除一个字符,所以如果满足条件,删除的字符一定与第一字符相等,且在此字符与第一字符之间没有其余字符。

所以我们只要确定第一字符,之后检查删除字符后的字符串是否与第二个字符串相等;如果符合条件,那么就分别向前向后检查相等的字符。

AC代码

#include<bits/stdc++.h>
using namespace std;
char s1[1000005],s2[1000005];
int n,wz=-1;
int main()
{
    cin>>(s1+1)>>(s2+1);
    n=strlen(s1+1);
    for(int i=1,j=1;i<=n;i++,j++)
    {
        if(i==n&&wz==-1&&s1[i]==s2[i-1]) break;//当检查到最后字符时全部字符都相同的情况
        if(s1[i]==s2[j]) continue;
        if(wz!=-1)//之前出现过第一字符
        {
            cout<<0;
            return 0;
        }
        wz=i;
        j--;//与i++,j++叠加就是i++,j不变;相当于删除当前字符
    }
    if(wz==-1)//全部字符都相同的情况
    {
        cout<<n<<endl;
        for(int i=1;i<=n;i++) cout<<i<<' ';
        return 0;
    }
    int sum=0,j;
    for(int i=wz;s1[i]==s1[wz];i++) sum++;//向前寻找
    for(j=wz-1;s1[j]==s1[wz];j--) sum++; //向后寻找
    cout<<sum<<endl;
    for(++j;j<wz;j++) cout<<j<<' ';
    for(int i=wz;s1[i]==s1[wz];i++) cout<<i<<' ';
    return 0;
}