Problem A: Delete it
Description
克林在打一行字母时总是会打多一个字符,比如想打”july”时会打成”juuly”,这样他需要删掉其中一个’u’。
克林想知道他可以删掉哪个位置的字符就可以变成他真正想打的一行字母。
Input
第一行一个整数:T (测试个数)
每个测试
输入两行,两个字符串(全是小写字母)
串长为 1 到 1000000
第一个串长度刚好比第二个的长度大一
Output
每个测试数据:
第一行输出可以删除的位置个数 P
如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)
Sample Input
3
juuly
july
abc
zz
aa
a
Sample Output
2
2 3
0
2
1 2
题目的意思是这人会多打一个字母,不一定是重复的之前的,样例中给出的基本都是重复多打了一个字母,被这个多打的字母都是重复的思想,影响了好久,也因此wa了很多次。突然想到多打的字母不一定是重复的,所以直接找才是正道,删掉之前的代码重写。
其实,只需要找到不同发生不同的位置、发生不同的次数就行了。
从头开始遍历,当发生不同时,用p记录下发生不同的时的位置,发生一次不同,记录的c就+1,当c有两次的时候就可以break跳出循环。
当c为2的时候,可以直接输出0,因为找到了两个不同的位置,而第一个串只比第二个串长1,没法修改。
当c为0的时候,从倒数第二个开始比,每次都和最后一个比较。相等,计数的s就+1,碰到不相等的时候就break结束循环。
当c为1的时候,从第一个不相等的位置开始往前比较。
#include<stdio.h>
#include<string.h>
char a[1001000],b[1001000];
int main()
{
int t;
int l1,l2,s,c,p;
int i,j,k;
scanf("%d",&t);
while(t--)
{
s=0;p=0;c=0;
scanf("%s%s",&a,&b);
l1=strlen(a);//记录数组长度
l2=l1-1;
for(i=0,j=0;i<l1&&j<l2;i++)
{
if(a[i]!=b[j])
{
p=i;//记录第一个不相等的位置
c++; //不等位置数量加1
if(c>1)break;
}
else j++;
}
if (c>1)
{
printf("0\n");
}
if(c==0)//没有发生不同时的情况,从倒数第二个开始,每次和最后一个比
{
for(i=l1-2;i>=0;i--)
{
if(a[i]==a[l1-1])
s++;
else break;
}
printf("%d\n",s+1);
for(j=i+2;j<=l1;j++)
if(j!=l1)
{
printf("%d ",j);
}else
{
printf("%d",j);
}
printf("\n");
}
else
if(c==1)//从第一个不等位置往前与a[p]比较
{
for(i=p-1;i>=0;i--)
{
if(a[i]==a[p])
s++;
else break;
}
printf("%d\n",s+1);
for(j=i+2;j<=p+1;j++)
if(j!=p+1)
{
printf("%d ",j);
}else
{
printf("%d",j);
}
printf("\n");
}
}
return 0;
}
printf("%d\n",sum+1);
for(j=i+2;j<=p+1;j++)
printf("%d ",j);
printf("\n");
这样写会PE。。。