fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. signed main()
  5. {
  6. string s;
  7. int t;
  8. cin>>s>>t;
  9. int n=s.size();
  10. int suf[n+1],pow[n];
  11. pow[n-1]=1;
  12. for(int a=n-2;a>=0;a--){
  13. pow[a]=(pow[a+1]*10)%33;
  14. }
  15. suf[n-1]=s[n-1]-'0';
  16. suf[n]=0;
  17. for(int a=n-2;a>=0;a--){
  18. suf[a]=(suf[a+1]+pow[a]*(s[a]-'0')%33)%33;
  19. }
  20. int pos[33][2];
  21. int mp[33];
  22. for(int a=0;a<33;a++){
  23. mp[a]=0;
  24. }
  25. for(int a=0;a<=n;a++){
  26. mp[suf[a]]++;
  27. if(mp[suf[a]]==1) pos[suf[a]][0]=a;
  28. else pos[suf[a]][1]=a;
  29. }
  30. if(t==1){
  31. int sum=0;
  32. for(int a=0;a<33;a++){
  33. sum+=mp[a]*(mp[a]-1)/2;
  34. }
  35. cout<<sum;
  36. }
  37. else{
  38. int mx=0;
  39. string d="0";
  40. for(int a=0;a<33;a++){
  41. if(mp[a]>=2){
  42. if(pos[a][1]-pos[a][0]>mx){
  43. mx=pos[a][1]-pos[a][0];
  44. d=s.substr(pos[a][0],pos[a][1]-pos[a][0]);
  45. }
  46. else{
  47. if(pos[a][1]-pos[a][0]==mx){
  48. string e=s.substr(pos[a][0],pos[a][1]-pos[a][0]);
  49. for(int b=0;b<e.size();b++){
  50. if(e[b]>d[b]){
  51. d=e;
  52. break;
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }
  59. if(d=="0") cout<<"-1";
  60. else cout<<d;
  61. }
  62. }
  63.  
Success #stdin #stdout 0.01s 5324KB
stdin
12312312312312
2
stdout
123123123123