Delete it
时间限制:
2000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
克林在打一行字母时总是会打多一个字符,比如想打”july”时会打成”juuly”,这样他需要删掉其中一个’u’。
克林想知道他可以删掉哪个位置的字符就可以变成他真正想打的一行字母。
-
输入
-
第一行一个整数:T (测试个数)
每个测试
输入两行,两个字符串(全是小写字母)
串长为 1 到 1000000
第一个串长度刚好比第二个的长度大一
输出
-
每个测试数据:
第一行输出可以删除的位置个数 P
如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)
样例输入
-
3 juuly july abc zz aa a
样例输出
-
2 2 3 0 2 1 2
直接循环比较字符,不会超时,代码注释中写思路
AC代码:
#include <stdio.h> #include <string.h> char a[1000003], b[1000003]; int c[1000003];//存可以删的字符下标 int main() { int T, i, j, t; scanf("%d", &T); while(T--) { char x = 0, fag = 0; scanf("%s%s", a+1, b+1); //字符串从a+1开始放主要是不想在后面存下标时(或输出每个下标时)每次都去+1 //个人感觉这样可以降低一定的时间复杂度 i = 1; int L = strlen(b+1); while(a[i] == b[i]) i++; j = i+1; t = i; while(a[j] == b[i] && i <= L) {//因为输入时是a+1,所以这里i<=L i++; j++; } if(i > L) fag = 1; j = 0; if(fag) {//fag为0不执行 //因为fag为0意味着没有可删除的字符让a串变成b串 c[j++] = t; x = a[t--]; } while(a[t] == x && t > 0) c[j++] = t--; //回到不相同的地方往前看有几个连续与该多余字符相同的 printf("%d\n", j); while(j--) printf("%d ", c[j]); if(fag == 1) printf("\n");//fag为0不输出换行 //不过这题有没有都能过 } return 0; }
欢迎交流
-
第一行一个整数:T (测试个数)