1. 程式人生 > 實用技巧 >CodeForces 368B. Sereja and Suffixes

CodeForces 368B. Sereja and Suffixes

思路:這道題是對於一串數字,每給定一個位置,就指出從這個位置往右一直到最後一個元素之間有多少不重複的數字。
涉及到數字重複問題,想到用map處理。再用動態規劃,從後往前依次加一或者不變既可。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int a[100005];
int dp[100005];
map<int,int> mp;

int main()
{
    int n,m;
//  int cnt = 0;
    cin>>n>>m;
    int pos;
    for(int i = 0;i<n;i++)
    {
        cin>>a[i];
    }
    dp[n-1] = 1;
    mp[a[n-1]] = 1;
    for(int i = n-2;i>=0;i--) //要從n-2開始,否則dp[n-1] = dp[n] = 0 那麼出現的結果每一個都將少一。
    {
        if(mp[a[i]] == 0)
        {

            mp[a[i]] = 1;//標記已經用過的數字 
            dp[i] = dp[i+1]+1;
        }
        else
        {
            dp[i] = dp[i+1];
        } 
    }
    for(int i = 0;i<m;i++)
    {
        cin>>pos;
        cout<<dp[pos-1]<<endl; 
    }
    return 0;

}