C/C++ Delete it

题目描述

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

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

输入

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

 

每个测试

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

串长为 1 到 1000000

第一个串长度刚好比第二个的长度大一

输出

每个测试数据:

第一行输出可以删除的位置个数 P

如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)

样例输入

3
juuly
july
abc
zz
aa

样例输出

2
2 3
0
2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s1[10000090], s2[10000000], ch = '#', h;
int n, c = 0, a[10000080], len1, len2, i, j, k, x;
int main(){
	while (scanf("%d", &n) != EOF)
	{
		while (n--)
		{
			ch = '#';
			h = c = 0;
			cin >> s1 >> s2;
			len1 = strlen(s1);
			len2 = strlen(s2);
			for (i = 0, k = 0; i< len2;){
				if (s1[k] != s2[i]){
					x = i;
					if (s1[k] != ch){
						h++;
						ch = s1[k];
					}
					if (h>1)break;
				}
				if (s1[k] == s2[i])i++;
				k++;
			}
			if (h>1){
				printf("0\n");
				continue;
			}
			if (h == 0){
				if (s1[len1 - 1] == s1[len1 - 2])
				for (int k = len1 - 1; k >= 0; k--){
					if (s1[k] == s1[len1 - 1])a[c++] = k + 1;
					else break;
				}
				else{
					printf("%d\n%d\n", 1, len1);
					continue;
				}

			}
			if (h)
			for (k = x; k >= 0; k--){
				if (s1[k] == ch)a[c++] = k + 1;
				else break;
			}
			if (h)
			for (k = x + 1; k < len1; k++){
				if (s1[k] == ch)a[c++] = k + 1;
				else break;
			}
			sort(a, a + c);
			printf("%d\n%d", c, a[0]);
			for ( i = 1; i < c; i++)printf(" %d", a[i]);
			printf("\n");
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值