fork download
  1. // cas O( (velkost vstupu) + (rozsah znamok)**(max. dlzka zakazaneho retazca+1) * (dlzka vyslednej postupnosti)
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <queue>
  6. using namespace std;
  7.  
  8. int main() {
  9. vector< vector<bool> > zak(7); // zakazane i-tice, v 5-kovej sustave
  10. zak[0].resize(1,true);
  11. for(int i =1; i < 7; i++) zak[i].resize(zak[i-1].size()*5,true);
  12. queue< pair<int,int> > q;
  13. pair<int,int> p;
  14. string s;
  15. int M;
  16. cin >> M;
  17. for(int i =0; i < M; i++) {
  18. cin >> s;
  19. p.second =s.length();
  20. p.first =0;
  21. for(int i =0; i < s.length(); i++) p.first =5*p.first+(s[i]-'1');
  22. q.push(p);
  23. // vyrob vsetky touto zacinajuce 6-tice
  24. while(!q.empty()) {
  25. if(!zak[q.front().second][q.front().first]) {q.pop(); continue;}
  26. zak[q.front().second][q.front().first] =false;
  27. if(q.front().second == 6) {q.pop(); continue;}
  28. p.second =q.front().second+1;
  29. for(int j =0; j < 5; j++) {
  30. p.first =q.front().first+j*zak[q.front().second].size();
  31. q.push(p);
  32. p.first =5*q.front().first+j;
  33. q.push(p);}
  34. q.pop();}}
  35.  
  36. vector< vector<long long> > C(10); // pocty postupnosti konciacich danou 6-ticou a dlzky 6+i
  37. for(int i =0; i < zak[6].size(); i++) C[0].push_back((long long)zak[6][i]);
  38. for(int i =0; i < 9; i++) {
  39. C[i+1].resize(C[i].size(),0LL);
  40. for(int j =0; j < C[i].size(); j++) for(int k =0; k < 5; k++)
  41. // pridam k na koniec, ak je to platna koncova 6-tica priratam k uz exitujucim
  42. C[i+1][(j*5+k)%15625] +=C[i][j]*(long long)zak[6][(j*5+k)%15625];}
  43. long long odp =0LL;
  44. for(int i =0; i < C[9].size(); i++) odp +=C[9][i];
  45. cout << odp << endl;
  46. return 0;}
Success #stdin #stdout 0.01s 2976KB
stdin
10
21
31
32
41
42
43
51
52
53
54
stdout
3876