NYOJ 359 Delete it 字符串处理

来源:互联网 发布:网络国际电话 编辑:程序博客网 时间:2024/06/03 09:38

Delete it

时间限制:2000 ms  |  内存限制:65535 KB
难度:2
描述

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

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

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

每个测试
输入两行,两个字符串(全是小写字母)
串长为 1 到 1000000
第一个串长度刚好比第二个的长度大一
输出
每个测试数据:
第一行输出可以删除的位置个数 P
如果P > 0 第二行输出可以删除的位置(小到大,空格隔开,位置从1开始算)
样例输入
3juulyjulyabczzaaa

样例输出

22 3021 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++; //不等位置数量加1if(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++; elsebreak;            }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;}        


原创粉丝点击