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;

}
原文地址:https://www.cnblogs.com/RioTian/p/13505525.html