POJ3096—Surprising Strings

題目:

所述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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章