-
描述
-
克林在打一行字母时总是会打多一个字符,比如想打”july”时会打成”juuly”,这样他需要删掉其中一个’u’。
克林想知道他可以删掉哪个位置的字符就可以变成他真正想打的一行字母。
-
输入
-
第一行一个整数:T (测试个数)
每个测试
输入两行,两个字符串(全是小写字母)
串长为 1 到 1000000
第一个串长度刚好比第二个的长度大一
输出
-
每个测试数据:
第一行输出可以删除的位置个数 P
如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)
样例输入
-
3 juuly july abc zz aa a
样例输出
2 2 3 0 2 1 2
从第一个位置开始比较,直到找到不相等的位置,记录不相等的位置,然后错位比较,如果又找到一处不相等的位置,即不相等的位置个数超过1个,跳出循环,输出0;然后用第一个字符串的最后一个元素一次与前面元素比较,如果相等,删除点个数加1,否则跳出循环。#include<stdio.h> #include<string.h> char s1[1000001],s2[1000001]; int main() { int n,i,j,p,cnt,len1,len2,sum; scanf("%d",&n); while(n--) { scanf("%s",s1); scanf("%s",s2); len1=strlen(s1); len2=len1-1; p=i=j=cnt=0; while(i<len1&&j<len2) { if(s1[i]!=s2[j]) { p=i; //记录第一个不相等的位置 cnt++; //不等位置数量加1 if(cnt>1) break; i++; //错位比较 } else {i++;j++;} } if(cnt>1)//不相等数量大于1,都不能删除 printf("0\n"); sum=0; //记录删除点的个数 if(cnt==0) /*abcd abc*/ { for(i=len1-2;i>=0;i--) //从倒数第二个元素开始,每次都和最后一个元素比较 { if(s1[i]==s1[len1-1]) sum++; else break; } printf("%d\n",sum+1); for(j=i+2;j<=len1;j++) //i记录与最后一个元素不等元素的位置,从i后一个开始输出,下标加1,最后一个元素位置为len1 printf("%d ",j); printf("\n"); } else if(cnt==1) { for(i=p-1;i>=0;i--) //从第一个不等位置往前与a[p]比较 { if(s1[i]==s1[p]) sum++; else break; } printf("%d\n",sum+1); for(j=i+2;j<=p+1;j++) printf("%d ",j); printf("\n"); } } return 0; }
-
第一行一个整数:T (测试个数)
NYOJ 359 Delete it 字符串处理
最新推荐文章于 2017-04-24 19:03:00 发布