Description
龙龙在研究字符串和字符串处理。龙龙发现有一些字符串让他第一眼看到就会发自内心的感到快乐,他把这些字符串称为“肥宅快乐串"。龙龙进一步研究发现,一个字符串是"肥宅快乐串",当且仅当这个字符串存在至少一个子串是"fattyhappy"。字符串的子串是指这个字符串中截下来的连续的一段。比如"fffffattyhappyyyyy"就有一个"fattyhappy"子串,而"faaaaattyhappy"就没有一个"fattyhappy"子串。现在龙龙看到了好多个字符串,他想对每一个字符串交换恰好一对字符的位置,使得这个字符串变成"肥宅快乐串"。请注意:必须进行一次交换,不允许不交换。龙龙真的很想见到"肥宅快乐串",请你帮帮龙龙吧,告诉他应该交换字符串里哪两个位置的字符。
Input
输入共有 T 加 1 行,其中 T 空格 左括号 1 小於等於 T 小於等於 1000 右括号 表示需要你进行操作的字符串个数;
第一行一个正整数T;
接下来第 2 到第 T 加 1 行,每行输入一个字符串,表示需要你帮忙变成"肥宅快乐串"的原来的字符串,一共有 T 行。
Output
输出 T 行,表示这 T 个字符串的交换方案。对于每个字符串,如果有解,输出两个数 i 逗號 j,表示交换字符串的第 i 个和第 j 个字符。否则输出一个数 負 1,表示没有方案。如果有多种方法使得它变成"肥宅快乐串",输出任意一种即可。
Note
所有数据保证 1 小於等於 T 小於等於 1000 空格 逗號 空格 竖线 s 下標 i 竖线 小於等於 1000 逗號 加總 從 i 對 竖线 s 下標 i 竖线 小於等於 10 的 5 次方。即单个字符串长度不超过 1000,所有字符串总长度不超过 10 的 5 次方。保证字符串中只有小写字母出现。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路
这题乍一看挺费事,但实际也就四种情况:有完整的快乐串,差一个字符,差两个字符,差三个及以上。
1.交换相同字母 t和t
2.检查这10个字母以外是否有需要的字母
3.检查这两个字符交换后是否满足
4.直接否掉
具体的步骤为两重循环。外层遍历字符串(注意边界条件 lenth-10)内层循环检查十个字母。可以设一些变量来记录与快乐串不同字符的个数以及位置。然后根据四种情况执行。
代码
#include<stdio.h>
#include<string.h>
#define N 1005
main()
{
char a[N],b[]="fattyhappy",c[15],temp;
int t,i,j,k,l,same,d[15]={0},x,y,flag;
char *m;
scanf("%d%*c",&t);
while(t--){
memset(a,0,sizeof(a));
gets(a);
l=strlen(a);
flag=0;
if(l<10){
printf("-1/n");
continue;
}
if((m=strstr(a,b))!=NULL){
printf("%d %d\n",m-a+3,m-a+4);
continue;
}
for(i=0;i<=l-10;i++){
memset(c,0,sizeof(c));
k=0;
same=10;
for(j=0;j<10;j++){
if(a[i+j]!=b[j]){
d[k++]=j;
same--;
if(same<8) break;
}
}
if(same>7) {
strncpy(c,a+i,10);
if(same==8){
temp=c[d[0]];
c[d[0]]=c[d[1]];
c[d[1]]=temp;
if(strcmp(c,b)==0){
flag=1;
x=i+d[0]+1;
y=i+d[1]+1;
break;
}
else continue;
}
else{
for(k=0;k<l;k++){
if(k>=i&&k<i+10) continue;
if(a[k]==b[d[0]]){
flag=1;
x=k+1;
y=i+d[0]+1;
break;
}
}
}
}
}
if(flag==1) printf("%d %d\n",x,y);
else printf("-1\n");
}
}