hdu 2736Surprising Strings

Surprising Strings

Problem Description

The D-pairs of a string of letters are the ordered pairs of letters that are distance D from each other. A string is D-unique if all of its D-pairs are different. A string is surprising if it is D-unique for every possible distance D.

Consider the string ZGBG. Its 0-pairs are ZG, GB, and BG. Since these three pairs are all different, ZGBG is 0-unique. Similarly, the 1-pairs of ZGBG are ZB and GG, and since these two pairs are different, ZGBG is 1-unique. Finally, the only 2-pair of ZGBG is ZG, so ZGBG is 2-unique. Thus ZGBG is surprising. (Note that the fact that ZG is both a 0-pair and a 2-pair of ZGBG is irrelevant, because 0 and 2 are different distances.)

Acknowledgement: This problem is inspired by the "Puzzling Adventures" column in the December 2003 issue of Scientific American.

Input

The input consists of one or more nonempty strings of at most 79 uppercase letters, each string on a line by itself, followed by a line containing only an asterisk that signals the end of the input.

Output

For each string of letters, output whether or not it is surprising using the exact output format shown below.

Sample Input

ZGBG
X
EE
AAB
AABA
AABB
BCBABCC
*

Sample Output

ZGBG is surprising.
X is surprising.
EE is surprising.
AAB is surprising.
AABA is surprising.
AABB is NOT surprising.
BCBABCC is NOT surprising.
解析:这题的题意就是给一个没有空格的字符串,在这个字符串中找一对一对的字母,开始是相连的两个字母,那AABB来说,就有三组AA,AB,和BB,然后是中间跳一个字母,就有AB,AB两组数据,最后就只剩下一组数据AB(第一个A和最后一个B)。在这三组测试数据中当中间隔一个字母的那组数据出现了相同的,所以就不是surprising。题目中给的ZGBG,不论是相邻的还是中间空一格,每组数据中都不会出现相同的,所以是suiprising。

思路:根据题意可以将给的字符串保存到一个二维数组中,因为都是两个所以数组的列数只有2。首先是字母相邻的,然后是字母间的距离为1,为2....,直到字符串中的第j个与它后面的第i个没相配的了就结束。最后对二维数组进行查找看是否有相等的,如果有,则直接退出,没有则增加i的个数。

#include"stdio.h"
#include"string.h"
int main()
{
int i,j,len,k,z,l,flag;
char ch[100];
char  s[100][2];
while(gets(ch))
{
memset(s,0,sizeof(s));
flag=0;
if(ch[0]=='*')
break;
len=strlen(ch);
for(i=1;i<len-1;i++)
 {
  k=0;
  for(j=0;j+i<len;j++)      //当第j个字母后面空了i个字母后,就不会出现配对的字母了。停止
 {
        s[k][0]=ch[j];                //配对的字母保存到一个二维数组中
s[k][1]=ch[j+i];
k++;
 }
 for(z=0;z<k;z++)                       //然后对二维数组进行查找看是否有相同的,如果有则退出,没有就将他们之间的字母加一重复比较
   for(l=z+1;l<k;l++)
   {
    if(s[z][0]==s[l][0]&&s[z][1]==s[l][1])
      {flag=1;break;}
    }
    if(flag==1)
    break;
   }
   if(flag==1)
   {
    printf("%s is NOT surprising.\n",ch);
   }
   else
   {
    printf("%s is surprising.\n",ch);
   }
   memset(ch,0,sizeof(ch));
}
return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值