1. 程式人生 > >南陽oj STL分類練習

南陽oj STL分類練習

1.括號配對問題

現在,有一行括號序列,請你檢查這行括號是否配對。

輸入
第一行輸入一個數N(0<N<=100),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有"[","]","(",")"四種字元
輸出

每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No

樣例輸入
3
[(])
(])
([[]()])
樣例輸出
No
No
Yes
 
<span style="font-family:Courier New;font-size:14px;">#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;

char s[10001];

int main()
{
	int N;
	scanf("%d\n",&N);
	stack<char>sta;
	while(N--)
	{
		while(!sta.empty()) 
			sta.pop();
		gets(s);
		sta.push(s[0]);
		int Len=strlen(s);
		for(int i=1;i<Len;i++)
		{
			if(sta.empty())
			{
				sta.push(s[i]); continue;
			}
			if( (sta.top()=='[' && s[i]==']') || ( sta.top()=='(' && s[i]==')' ) )
			{
				sta.pop();
			}
			else
			{
				sta.push(s[i]);
			}
		}
		if(!sta.empty())
		{
			printf("No\n");
		}
		else
		{
			printf("Yes\n");
		}
	}
	return 0;
}</span>
        

             2.

ASCII碼排序

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:2
描述
輸入三個字元(可以重複)後,按各字元的ASCII碼從小到大的順序輸出這三個字元。
輸入
第一行輸入一個數N,表示有N組測試資料。後面的N行輸入多組資料,每組輸入資料都是佔一行,有三個字元組成,之間無空格。
輸出
對於每組輸入資料,輸出一行,字元中間用一個空格分開。
樣例輸入
2
qwe
asd
樣例輸出
e q w
a d s
 
<span style="font-family:Courier New;font-size:18px;">#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s1,s2;
    int n;
    cin>>n;
    while(n--)
    {
        cin>>s1>>s2;
        int pos=s2.find(s1,0);
        int sum=0;
        while(pos!=string::npos)
        {
            sum++;
            pos=s2.find(s1,pos+1);
        }
        cout<<sum<<endl;
    }
    return 0;
}</span>
        

Binary String Matching

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
輸入
The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A.
輸出
For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
樣例輸入
3
11
1001110110
101
110010010010001
1010
110100010101011 
樣例輸出
3
0
3 

 
<span style="font-family:Courier New;font-size:18px;">#include <iostream>
#include <string>
using namespace std;

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string s1,s2;
        cin>>s1>>s2;
        int sum=0;
        for(int i=0;i<s2.length();i++)
        {
            int j;
            for(j=0;j<s1.length();j++)
            {
                if(s2[i+j] != s1[j])
                    break;
            }
            if(j == s1.length())
            {
                sum++;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}</span>
        

一種排序

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述
現在有很多長方形,每一個長方形都有一個編號,這個編號可以重複;還知道這個長方形的寬和長,編號、長、寬都是整數;現在要求按照一下方式排序(預設排序規則都是從小到大);

1.按照編號從小到大排序

2.對於編號相等的長方形,按照長方形的長排序;

3.如果編號和長都相同,按照長方形的寬排序;

4.如果編號、長、寬都相同,就只保留一個長方形用於排序,刪除多餘的長方形;最後排好序按照指定格式顯示所有的長方形;
輸入
第一行有一個整數 0<n<10000,表示接下來有n組測試資料;
每一組第一行有一個整數 0<m<1000,表示有m個長方形;
接下來的m行,每一行有三個數 ,第一個數表示長方形的編號,

第二個和第三個數值大的表示長,數值小的表示寬,相等
說明這是一個正方形(資料約定長寬與編號都小於10000);
輸出
順序輸出每組資料的所有符合條件的長方形的 編號 長 寬
樣例輸入
1
8
1 1 1
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
樣例輸出
1 1 1
1 2 1
1 2 2
2 1 1
2 2 1
 
<span style="font-size:18px;">#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

struct Node
{
    int id,len,width;
    bool operator==(Node t)
    {
        return id==t.id && len==t.len && width==t.width;
    }
};
vector<Node> vec;
bool cmp(Node r1,Node r2)
{
    if(r1.id<r2.id)
    {
        return true;
    }
    else if(r1.id==r2.id)
    {
        if(r1.len<r2.len)
            return true;
        else if(r1.len==r2.len)
        {
            if(r1.width<r2.width)
                return true;
        }
    }
    return false;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        Node temp;
        for(int i=0;i<n;i++)
        {
            cin>>temp.id>>temp.len>>temp.width;
            if(temp.len<temp.width)
                swap(temp.len,temp.width);
            vec.push_back(temp);
        }
        sort(vec.begin(),vec.end(),cmp);
        vector<Node>::iterator last = unique(vec.begin(),vec.end());
        for(vector<Node>::iterator itr=vec.begin();itr!=last;++itr)
        {
            cout<<(*itr).id<<" "<<(*itr).len<<" "<<(*itr).width<<endl;
        }
        vec.clear();
    }
    return 0;
}</span>


擅長排列的小明

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4
描述
小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的很擅長。現在需要你寫一個程式來驗證擅長排列的小明到底對不對。
輸入
第一行輸入整數N(1<N<10)表示多少組測試資料,
每組測試資料第一行兩個整數 n m (1<n<9,0<m<=n)
輸出
在1-n中選取m個字元進行全排列,按字典序全部輸出,每種排列佔一行,每組資料間不需分界。如樣例
樣例輸入
2
3 1
4 2
樣例輸出
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
 
<span style="font-size:18px;">#include <iostream>
#include <cstring>
using namespace std;

bool vis[10];
int out[10];

void f(int n,int m,int T)
{
    if(T>m)
    {
        for(int i=1;out[i]!=0;i++)
        {
            cout<<out[i];
        }
        cout<<endl;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            out[T]=i;
            vis[i]=1;
            f(n,m,T+1);
            vis[i]=0;
        }
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        memset(vis,0,sizeof(vis));
        memset(out,0,sizeof(out));
        f(n,m,1);
    }
    return 0;
}</span>
  

韓信點兵

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:1
描述
相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7),輸出總人數的最小值(或報告無解)。已知總人數不小於10,不超過100 。
輸入
輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7)。例如,輸入:2 4 5
輸出
輸出總人數的最小值(或報告無解,即輸出No answer)。例項,輸出:89
樣例輸入
2 1 6
樣例輸出
41
 
<span style="font-size:18px;">#include <cmath>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    //freopen("input.txt","r",stdin);
    int x,y,z,ans;
    scanf("%d %d %d",&x,&y,&z);
    for(ans=10;ans<=100;ans++)
    {
        if( ans%3==x && ans%5==y && ans%7==z)
            break;
    }
    if(ans<=100)
        printf("%d\n",ans);
    else
        printf("No answer\n");
    return 0;
}


/*ans%3=x;
ans%5=y;
ans%7=z;

3*t1+x=ans;
5*t2+y=ans;
7*t3+z=ans;

x,y,z 2 1 6
3*t1+5*t2+7*t3+x+y+z=3*ans
*/        </span>

懶省事的小明

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述
      小明很想吃果子,正好果園果子熟了。在果園裡,小明已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。小明決定把所有的果子合成一堆。 因為小明比較懶,為了省力氣,小明開始想點子了:
  每一次合併,小明可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。小明在合併果子時總共消耗的體力等於每次合併所耗體力之和。
  因為還要花大力氣把這些果子搬回家,所以小明在合併果子時要儘可能地節省體力。假定每個果子重量都為1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使小明耗費的體力最少,並輸出這個最小的體力耗費值。
  例如有3種果子,數目依次為1,2,9。可以先將1、2堆合併,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為12。所以小明總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。
輸入
第一行輸入整數N(0<N<=10)表示測試資料組數。接下來每組測試資料輸入包括兩行,第一行是一個整數n(1<=n<=12000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai(1<=ai&lt;=20000)是第i種果子的數目。
輸出
每組測試資料輸出包括一行,這一行只包含一個整數,也就是最小的體力耗費值。
樣例輸入
1
3 
1 2 9
樣例輸出
15

 
<span style="font-size:18px;">#include <map>
#include <set>
#include <vector>
#include <queue>
#include <bitset>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int a[12005];
int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG

    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++) {
            scanf("%d",&a[i]);
        }
        priority_queue<int,vector<int>,greater<int> > pq(a,a+n);
        long long ans=0;
        while(true) {
            int first=0,last=0;
            if(!pq.empty()) {
                first=pq.top();
                pq.pop();
            }
            if(!pq.empty()) {
                last=pq.top();
                pq.pop();
            }
            if(first && last) {
                ans = ans +first +last;
                pq.push(first+last);
            }
            else {
                break;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}</span>
        

找球號(一)

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述
在某一國度裡流行著一種遊戲。遊戲規則為:在一堆球中,每個球上都有一個整數編號i(0<=i&lt;=100000000),編號可重複,現在說一個隨機整數k(0<=k<=100000100),判斷編號為k的球是否在這堆球中(存在為"YES",否則為"NO"),先答出者為勝。現在有一個人想玩玩這個遊戲,但他又很懶。他希望你能幫助他取得勝利。
輸入
第一行有兩個整數m,n(0<=n<=100000,0<=m<=1000000);m表示這堆球裡有m個球,n表示這個遊戲進行n次。
接下來輸入m+n個整數,前m個分別表示這m個球的編號i,後n個分別表示每次遊戲中的隨機整數k
輸出
輸出"YES"或"NO"
樣例輸入
6 4
23 34 46 768 343 343
2 4 23 343
樣例輸出
NO
NO
YES
YES
 
<span style="font-size:18px;">#include <cmath>
#include <set>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG

    int m,n;
    scanf("%d%d",&m,&n);
    set<int> ball;
    int temp;
    for(int i=0;i<m;i++) {
        scanf("%d",&temp);
        ball.insert(temp);
    }
    for(int i=0;i<n;i++) {
        scanf("%d",&temp);
        if(ball.count(temp)>0)
            printf("YES");
        else
            printf("NO");
        putchar('\n');
    }
    return 0;
}</span>
        

漢諾塔(三)

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述

在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

現在我們把三根針編號為1,2,3。

所有的金片在初始時都在1號針上,現在給你的任務是判斷一系列的指令過程中,是否會出現非法的指令。

而非法指令有以下兩種情況:

1、某個針上已經沒有金片了,但是指令依然要求從該處移動金片到其它針上。

2、把一個大的金片移動到了小的金片上。

輸入
第一行輸入一個整數N表示測試資料的組數(N<10)
每組測試資料的第一行有兩個整數P,Q(1<P<64,1<Q<100),分別表示漢諾塔的層數與隨後指令的條數
隨後的Q行,每行都輸入兩個整數a,b,(1<=a,b<=3)表示一條指令。
指令1 2表示把1號針最上面的金片移動到2號針最上面。
資料保證a,b不會相同。
輸出
如果存在非法指令,請輸出illegal
不存在非法指令則輸出legal
樣例輸入
3
2 1
1 2
3 3
1 2
1 3
3 2
2 1
2 1
樣例輸出
legal
illegal
illegal
 
<span style="font-size:18px;">#include <map>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

stack<int> a;
stack<int> b;
stack<int> c;
map<int,stack<int> > numToStack;

int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG
    numToStack.insert(pair<int,stack<int> >(1,a));
    numToStack.insert(pair<int,stack<int> >(2,b));
    numToStack.insert(pair<int,stack<int> >(3,c));
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int p,q;
        scanf("%d%d",&p,&q);
        while(!numToStack[1].empty()) numToStack[1].pop();
        while(!numToStack[2].empty()) numToStack[2].pop();
        while(!numToStack[3].empty()) numToStack[3].pop();
        for(int i=p;i>=1;i--) numToStack[1].push(i);
        bool ok=true;
        for(int i=0;i<q;i++)
        {
            int from,to;
            scanf("%d%d",&from,&to);
            if(!ok) continue;
            if(numToStack[from].empty()) {
                ok=false; continue;
            }
            int temp=numToStack[from].top();
            if(numToStack[to].empty()) {
                numToStack[from].pop();
                numToStack[to].push(temp);
                continue;
            }
            int temp2=numToStack[to].top();
            if(temp>temp2) {
                ok=false; continue;
            }
            else {
                numToStack[from].pop();
                numToStack[to].push(temp);
            }
        }
        if(ok) {
            printf("legal\n");
        }
        else {
            printf("illegal\n");
        }
    }
    return 0;
}
        </span>

眾數問題

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述

所謂眾數,就是對於給定的含有N個元素的多重集合,每個元素在S中出現次數最多的成為該元素的重數,

多重集合S重的重數最大的元素成為眾數。例如:S={1,2,2,2,3,5},則多重集S的眾數是2,其重數為3。

現在你的任務是:對於給定的由m個自然陣列成的多重集S,計算出S的眾數及其重數。

輸入
第一行為n,表示測試資料組數。(n<30)
每組測試的第一行是一個整數m,表示多重集S中元素的個數為m
接下來的一行中給出m(m<100)個不大於10萬的自然數
(不會出現不同元素出現的次數相同的情況,如:S={11,11,22,22,33,33})。
輸出
每組測試資料輸出一行,包含兩個數,第一個是眾數,第二個是其重數,中間以空格隔開。
樣例輸入
1
6
1 2 2 2 3 5
樣例輸出
2 3
 
<span style="font-size:18px;">#include <map>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG
  
    int T;
    scanf("%d",&T);
    while(T--)
    {
          map<int,int> maped;
        int maxnum=1;
        int ans=0;
        int n;
        scanf("%d",&n);
        int x;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&x);
            if(maped.count(x)==0){
                maped.insert(pair<int,int>(x,1));
            }
            else {
                maped[x]++;
                if(maped[x]>maxnum) {
                    maxnum=maped[x];
                    ans=x;
                }
            }
        }
        if(ans)
            printf("%d %d\n",ans,maxnum);
        else
            printf("%d 1\n",x);
    }
    return 0;
}</span>

字串替換

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:2
描述
編寫一個程式實現將字串中的所有"you"替換成"we"
輸入
輸入包含多行資料

每行資料是一個字串,長度不超過1000
資料以EOF結束
輸出
對於輸入的每一行,輸出替換後的字串
樣例輸入
you are what you do
樣例輸出
we are what we do
 
<span style="font-size:18px;">#include <map>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

char s[1005];
int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG

    while( fgets(s,1005,stdin)!=NULL)
    {
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            char *p= strstr(s+i,"you");
            if(p)
            {
                for(char *ptr=s+i;ptr<p;ptr++)
                    putchar(*ptr);
                putchar('w');
                putchar('e');
                i= (p-s+2);
            }
            else {
                for(char *ptr=s+i;ptr<s+len;ptr++)
                    putchar(*ptr);
                break;
            }
        }
    }
    return 0;
}</span>

D的小L

時間限制:4000 ms  |  記憶體限制:65535 KB 難度:2
描述
      一天TC的匡匡找ACM的小L玩三國殺,但是這會小L忙著哩,不想和匡匡玩但又怕匡匡生氣,這時小L給匡匡出了個題目想難倒匡匡(小L很D吧),有一個數n(0<n<10),寫出1到n的全排列,這時匡匡有點囧了,,,聰明的你能幫匡匡解圍嗎?
輸入
第一行輸入一個數N(0<N<10),表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個整數x(0<x<10)
輸出
按特定順序輸出所有組合。
特定順序:每一個組合中的值從小到大排列,組合之間按字典序排列。
樣例輸入
2
2
3
樣例輸出
12
21
123
132
213
231
312
321
 
<span style="font-size:18px;">#include <map>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

char s[1005];
int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG

    int T;
    scanf("%d",&T);
    int a[10];
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            a[i]=i+1;
        do {
            for(int i=0;i<n;i++)
                printf("%d",a[i]);
            putchar('\n');
        }
        while(next_permutation(a,a+n));
    }
    return 0;
}</span>

Same binary weight

時間限制:300 ms  |  記憶體限制:65535 KB 難度:3
描述

The binary weight of a positive  integer is the number of 1's in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positive integer N,return the smallest integer greater than N that has the same binary weight as N.N will be between 1 and 1000000000,inclusive,the result is guaranteed to fit in a signed 32-bit interget.

輸入
The input has multicases and each case contains a integer N.
輸出
For each case,output the smallest integer greater than N that has the same binary weight as N.
樣例輸入
1717
4
7
12
555555
樣例輸出
1718
8
11
17
555557
 
<span style="font-size:18px;">#include <map>
#include <set>
#include <bitset>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        bitset<32> mybits( (unsigned)n );
        string s=mybits.to_string();
        next_permutation(s.begin(),s.end());
        int ans=0;
        int bei=1;
        for(int i=s.size()-1;i>=0;i--) {
            ans=ans+(s[i]-'0')*bei;
            bei*=2;
        }
        printf("%d\n",ans);
    }
    return 0;
}  </span>      

Registration system

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:2
描述

A new e-mail service "Berlandesk" is going to be opened in Berland in the near future.

 The site administration wants to launch their project as soon as possible, that's why they

 ask you to help. You're suggested to implement the prototype of site registration system. 

The system should work on the following principle.

Each time a new user wants to register, he sends to the system a request with his name.

 If such a name does not exist in the system database, it is inserted into the database, and 

the user gets the response OK, confirming the successful registration. If the name already 

exists in the system database, the system makes up a new user name, sends it to the user 

as a prompt and also inserts the prompt into the database. The new name is formed by the

 following rule. Numbers, starting with 1, are appended one after another to name (name1,

 name2, ...), among these numbers the least i is found so that namei does not yet exist in

 the database.


輸入
The first line contains number n (1 ≤ n ≤ 105). The following n lines contain the requests to the system. Each request is a non-empty line, and consists of not more than 1000 characters, which are all lowercase Latin letters.
輸出
Print n lines, which are system responses to the requests: OK in case of successful registration, or a prompt with a new name, if the requested name is already taken.
樣例輸入
4
abacaba
acaba
abacaba
acab
樣例輸出
OK
OK
abacaba1
OK
 
<span style="font-size:18px;">#include <map>
#include <set>
#include <bitset>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

char s[1005];
map<string,int> maped;
int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG
    int T;
    scanf("%d\n",&T);
    while(T--)
    {
        scanf("%s",s);
        if(maped.count(s)==0) {
            printf("OK\n");
            maped.insert(pair<string,int>(s,0));
        }
        else {
            maped[s]++;
            printf("%s%d\n",s,maped[s]);
        }
    }
    return 0;
}</span>
        

求次數

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:2
描述

題意很簡單,給一個數n 以及一個字串str,區間【i,i+n-1】 為一個新的字串,i 屬於【0,strlen(str)】如果新的字串出現過ans++,例如:acmacm n=3,那麼 子串為acm cma mac acm ,只有acm出現過

求ans;

輸入
LINE 1: T組資料(T<10)
LINE 2: n ,n <= 10,且小於strlen(str);
LINE 3:str
str 僅包含英文小寫字母 ,切長度小於10w
輸出
求 ans
樣例輸入
2
2
aaaaaaa
3
acmacm
樣例輸出
5
1
 
<span style="font-size:18px;">#include <map>
#include <set>
#include <string>
#include <cmath>
#include <stack>
#include <cstdio>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

char s[100005];
int main()
{
    #ifdef LOCAL_DEBUG
    freopen("input.txt","r",stdin);
    #endif // LOCAL_DEBUG

    int T;
    scanf("%d\n",&T);
    while(T--)
    {
        set<string> seted;
        int n;
        scanf("%d\n",&n);
        scanf("%s",s);
        int len=strlen(s);
        int ans=0;
        for(int i=0;i<=len-n;i++)
        {
            string str(s+i,s+i+n);
            if(seted.count(str)==0) {
                seted.insert(str);
            }
            else {
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}</span>


加油!