CodeForces #352B.Jeff and Periods

来源:互联网 发布:在手机淘宝购物的步骤 编辑:程序博客网 时间:2024/06/04 17:51

题目链接:传送门
看题看了好久,最后题意还是问出来的….
题意给定n个数的序列,这里面会有一些一样的数,把这些一样的数抽出来,看看他们在序列中的下标是否构成一个等差数列,如果是输出这个数和差值。
如果一个数只出现一次,那么输出差值为0
代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define N 100001int a[N],p[N],c[N],vis[N],b[N];int main(){    int i,j,n,m;    while(scanf("%d",&n)!=EOF){        for(i=1;i<=n;i++){            cin>>a[i];            p[a[i]]++;            if(p[a[i]]==1){                c[a[i]]=i;            }            if(p[a[i]]==2){                b[a[i]]=i-c[a[i]];                c[a[i]]=i;            }            if(p[a[i]]>2){                if((i-c[a[i]])!=b[a[i]]){                    b[a[i]]=0;                }                else c[a[i]]=i;            }        }        int cnt=0;        sort(a+1,a+1+n);        for(i=1;i<=n;i++){                if(vis[a[i]]) continue;        vis[a[i]]=1;            if(p[a[i]]==1) {cnt++;continue;}            if(b[a[i]]!=0) cnt++;        }        memset(vis,0,sizeof(vis));        cout<<cnt<<endl;        for(i=1;i<=n;i++){            if(vis[a[i]]) continue;           vis[a[i]]=1;            if(p[a[i]]==1){                cout<<a[i]<<" "<<"0"<<endl;                continue;            }            if(b[a[i]])                cout<<a[i]<<" "<<b[a[i]]<<endl;        }    }    return 0;}
1 0
原创粉丝点击