[ACM] POJ 3096 Surprising Strings (map的使用),poj3096

來源:互聯網
上載者:User

[ACM] POJ 3096 Surprising Strings (map的使用),poj3096

Surprising Strings
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5783   Accepted: 3792

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

ZGBGXEEAABAABAAABBBCBABCC*

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.

Source

Mid-Central USA 2006


解題思路:

判斷一個字串是不是surpring。

條件:該字串的所有D-pairs,D是字串中兩個字母的距離, 如果所有的D-pairs都不同,那麼該字串是D-unique。如果對所有的距離D,都滿足D-unique,那麼字串就是surpring.

比如ZGBG

0-pairs :  ZG  GB BG  不相同,是0-unique

1-pairs :  ZB  GG        不相同,是1-unique

2-pairs:   ZG               不相同,是2-unique

綜上,ZGBG是surpring

每一個D-pairs進行判斷,如果在判斷一個D-pairs過程中有相同的,那麼該字串肯定不是surpring。

用map<string,bool> 來判斷是否字串已經出現過,要注意其聲明的位置,要在每一層D迴圈裡面聲明。

代碼:

#include <iostream>#include <stdio.h>#include <map>#include <string.h>using namespace std;char str[80];int main(){    while(scanf("%s",str)!=EOF&&str[0]!='*')    {        int len=strlen(str);        if(len<=2)        {            cout<<str<<" is surprising."<<endl;            continue;        }        bool ok=1;//是surpring        for(int d=0;d<=len-2;d++)//距離d        {            bool dtap=1;//是D-unique            map<string,bool>mp;//注意其聲明的位置            for(int s=0;s<=len-2&&s+d+1<len;s++)            {                string temp="";                temp+=str[s];                temp+=str[s+d+1];                if(mp[temp])//該字串出現過                {                    dtap=0;                    break;                }                else                    mp[temp]=1;            }            if(!dtap)            {                ok=0;                break;            }        }        if(ok)            cout<<str<<" is surprising."<<endl;        else            cout<<str<<" is NOT surprising."<<endl;    }    return 0;}



參加ACM大賽應該準備什課程?

ACM常用演算法及練習
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡代碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小產生樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分尋找. (代碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 調用系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位間的轉換

第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜尋、A*演算法,最小耗散優先.

相關的知識

圖論

路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
可以用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏最佳化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈演算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造

產生樹問題
最小產生樹
第k小產生樹
最優比率產生樹
0/1分數規劃
度限制產生樹

連通性問題
強大的DFS演算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基

有向非循環圖
拓撲排序
有向非循環圖與動態規劃的關係

二分圖匹配問題
一般圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻

網路流問題
網路流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
......餘下全文>>
 
西南交大acm動態規劃問題有什?

ACM常用演算法及練習
第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡代碼,
因為太常用,所以要練到寫時不用想,10-15分鐘內打完,甚至關掉顯示器都可以把程式打
出來.
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小產生樹(先寫個prim,kruscal要用並查集,不好寫)
3.大數(高精度)加減乘除
4.二分尋找. (代碼可在五行以內)
5.叉乘、判線段相交、然後寫個凸包.
6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡)
7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式.
8. 調用系統的qsort, 技巧很多,慢慢掌握.
9. 任意進位間的轉換

第二階段:練習複雜一點,但也較常用的演算法。
如:
1. 二分圖匹配(匈牙利),最小路徑覆蓋
2. 網路流,最小費用流。
3. 線段樹.
4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp
6.博弈類演算法。博弈樹,二進位法等。
7.最大團,最大獨立集。
8.判斷點在多邊形內。
9. 差分約束系統.
10. 雙向廣度搜尋、A*演算法,最小耗散優先.

相關的知識

圖論

路徑問題
0/1邊權最短路徑
BFS
非負邊權最短路徑(Dijkstra)
可以用Dijkstra解決問題的特徵
負邊權最短路徑
Bellman-Ford
Bellman-Ford的Yen-氏最佳化
差分約束系統
Floyd
廣義路徑問題
傳遞閉包
極小極大距離 / 極大極小距離
Euler Path / Tour
圈套圈演算法
混合圖的 Euler Path / Tour
Hamilton Path / Tour
特殊圖的Hamilton Path / Tour 構造

產生樹問題
最小產生樹
第k小產生樹
最優比率產生樹
0/1分數規劃
度限制產生樹

連通性問題
強大的DFS演算法
無向圖連通性
割點
割邊
二連通分支
有向圖連通性
強連通分支
2-SAT
最小點基

有向非循環圖
拓撲排序
有向非循環圖與動態規劃的關係

二分圖匹配問題
一般圖問題與二分圖問題的轉換思路
最大匹配
有向圖的最小路徑覆蓋
0 / 1矩陣的最小覆蓋
完備匹配
最優匹配
穩定婚姻

網路流問題
網路流模型的簡單特徵和與線性規劃的關係
最大流最小割定理
最大流問題
......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.