题目描述
克林在打一行字母时总是会打多一个字符,比如想打”july”时会打成”juuly”,这样他需要删掉其中一个’u’。
克林想知道他可以删掉哪个位置的字符就可以变成他真正想打的一行字母。
输入
第一行一个整数:T (测试个数)
每个测试
输入两行,两个字符串(全是小写字母)
串长为 1 到 1000000
第一个串长度刚好比第二个的长度大一
输出
每个测试数据:
第一行输出可以删除的位置个数 P
如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)
样例输入
juuly
july
abc
zz
aa
a
样例输出
2 3
0
2
1 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;
}