CF39J题解
wz20201136 · · 题解
思路
我们暂时称“第一字符”为第一个
因为题目中说只会删除一个字符,所以如果满足条件,删除的字符一定与第一字符相等,且在此字符与第一字符之间没有其余字符。
所以我们只要确定第一字符,之后检查删除字符后的字符串是否与第二个字符串相等;如果符合条件,那么就分别向前向后检查相等的字符。
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;
}