題目:
所述d-對字母的字符串的是有序對的是彼此的距離d字母。字符串是d-獨特的,如果所有的d-對是不同的。的字符串是令人驚訝的,如果它是d-獨特的每一個可能的距離D.
考慮串ZGBG。其0對是ZG,GB和BG。由於這三對都是不同的,ZGBG是0,唯一的。類似地,1-對ZGBG的是ZB和GG,並且由於這兩個對是不同的,ZGBG是1-唯一的。最後,只有2對ZGBG的是ZG,所以ZGBG是2-唯一的。因此ZGBG是令人驚訝的。 (注意這樣一個事實,ZG既是0對和2對ZGBG的是無關緊要的,因爲0和2是不同的距離。)
確認:此問題是由科學美國人的2003年12月號的“迷宮歷險記”欄目的啓發。
輸入
輸入包括至多79個大寫字母的一個或多個非空字符串,由本身的線的每個字符串,隨後僅含有一個星號的線的所述輸入信號的結束。
產量
爲字母,輸出它是否被使用以下所示的精確的輸出格式奇每個字符串。
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.
解題思路:這個題主要是用STL中的map容器,首先每一次把間隔爲0、1、2…的串找出來,然後存入map容器中,map 的型號爲<string int 》,然後去遍歷一遍間隔不同的map,如果出現相同字符串大於2的就輸出not;
程序代碼:
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<string.h>
using namespace std;
int main()
{
char s[100],s1[100];
int n,i,j,k,t,flag,count;
char x,y;
while(scanf("%s",s)!=EOF)
{
if(s[0]=='*')
break;
flag=0;
n=strlen(s);
for(i=1;i<=n-2;i++)
{
k=0;
t=1;
map<string,int> m1;
while(k+i<n)
{
s1[0]=s[k];
s1[1]=s[k+i];
m1[s1]++;
k++;
}
map<string,int>::iterator it1;
for(it1=m1.begin();it1!=m1.end();it1++)
{
if((*it1).second>=2)
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==0)
printf("%s is surprising.\n",s);
else
printf("%s is NOT surprising.\n",s);
}
return 0;
}