数组去重 usaco Prime Palindromes

//一个有用的方法就是slt中的unique函数的实现,它基于三个指针,first, last , , result;

//其中first 指向第一个不和result 内的值相等的位置 ; last 作为哨兵位置 ;; 而result 作为已经判定不重复点的最后一个位置

template <class ForwardIterator> ForwardIterator unique ( ForwardIterator first, ForwardIterator last ) { ForwardIterator result=first; while (++first != last) { if (!(*result == *first)) *(++result)=*first; } return ++result; } 

/* ID:119243 LANG:C++ TASK:pprime */ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <queue> #include <map> #include <algorithm> #include <memory.h> #include <set> #include <cmath> #include <cstdlib> using namespace std; const int MAX=100,INF=1<<30; struct Number{ int num,w; bool operator < (const Number & i)const{ if(w!=i.w) return w<i.w; return num<i.num; } }; int a,b,W; Number N; vector<int> ans; vector<int>::iterator first,last,result; queue<Number> q; //set<Number> s; inline bool isPrime(int & i){ for(int j=2;j*j<=i;j++) if(!(i%j)) return 0; return 1; } inline int digits(int i){ int t=0; if(!i) return 1; while(i){ ++t; i=i/10; } return t; } void myUnique(){ first=ans.begin(); last=ans.end(); result = ans.begin(); while(++first!=last){ if(!(*result==*first)) *(++result)=*first; } last=++result; } int main() { freopen("i.txt","r",stdin); // freopen("pprime.in","r",stdin); // freopen("pprime.out","w",stdout); int w,c,t; Number T; while(cin>>a>>b){ W=digits(b); //cout<<W<<endl; ans.clear(); //s.clear(); for(int i=0;i<=9;i++){ T.num=i; T.w=1; //cout<<i<<endl; //if(s.count(T)==0){ q.push(T); //s.insert(i); //} //if(s.count(i*10+i)==0){ //q.push(i*10+i); T.num=i*10+i; T.w=2; q.push(T); //s.insert(i*10+i); //} //if(i*10+i==11) // cout<<"sasd"<<endl; } while(!q.empty()){ //cout<<"ad"<<endl; N=q.front(); q.pop(); c=N.num; //if(c==131) // cout<<"asdasdasd"<<endl; if(c>=a&&c<=b&&isPrime(c)) ans.push_back(c); //w=digits(c); w=N.w; //if(c==11) // cout<<"asda"<<endl; ++w; for(int i=0;i<=9;i++){ //t=ele[i]*pow(10,w)+c*10+ele[i]; t=i*(int)pow(10,w)+c*10+i; //cout<<t<<endl; //cout<<"w: "<<w<<" "<<pow(10,w)<<endl; if(w+1<=W&&t<=b){ //cout<<t<<endl; //if(s.count(t)==0){ T.num=t; T.w=w+1; q.push(T); //s.insert(t); //} } } } myUnique(); sort(ans.begin(),last); for(first=ans.begin();first!=last;first++) cout<<*first<<endl; } return 0; }  

 

你可能感兴趣的:(数组去重 usaco Prime Palindromes)