2013暑假新生赛第4场 Problem A: Delete it

本文介绍了一种用于解决打字时多打字母问题的高效算法,通过比较两个字符串,找出多余字母的位置,从而帮助用户准确地删除多余的字符。算法流程包括遍历字符串、记录不同位置和数量,以及根据不同情况输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem A: Delete it


Description

克林在打一行字母时总是会打多一个字符,比如想打july时会打成juuly,这样他需要删掉其中一个u

克林想知道他可以删掉哪个位置的字符就可以变成他真正想打的一行字母。

Input

第一行一个整数:T (测试个数)

每个测试

输入两行,两个字符串(全是小写字母)

串长为 到 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。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值