CodeFestival-qualC D Yet Another Palindrome Partitioning(700)

bit単位への圧縮

よくある、偶奇とかmod2とかの 0と1にするやつ

こうするとNが一つ2になるので、今回は2^26で通った

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<queue>
  5. #define lol(i,n) for(int i=0;i<n;i++)
  6. #define mod 1000000007
  7. typedef long long ll;
  8. using namespace std;
  9. #include<unordered_map>
  10. unordered_map<int,vector<int> >v;
  11. //vector<int> v[1<<26];
  12. int mark[200010];
  13. int dp[200010];
  14. int main(){
  15. string s;
  16. cin>>s;
  17. int r=1;
  18. lol(i,26)r*=2;
  19. lol(i,s.size()+1)dp[i]=mod;
  20. dp[0]=0;
  21. mark[0]=0;
  22. int cnt[26]={0};
  23. for(int i=0;i<s.size();i++){
  24. cnt[s[i]-'a']++;
  25. cnt[s[i]-'a']%=2;
  26. int tmp=0;
  27. int a=1;
  28. lol(j,26){
  29. tmp+=a*cnt[j];
  30. a*=2;
  31. }
  32. v[tmp].push_back(i+1);
  33. mark[i+1]=tmp;
  34. }
  35.  
  36. for(int i=0;i<s.size();i++){
  37. int k=mark[i];
  38. if(upper_bound(v[k].begin(),v[k].end(),i)!=v[k].end()){
  39. int it=*upper_bound(v[k].begin(),v[k].end(),i);
  40. dp[it]=min(dp[it],dp[i]);
  41. }
  42. int a=1;
  43. for(int j=0;j<26;j++){
  44. int tmp=mark[i];
  45. if(mark[i]%(a*2)<a){
  46. tmp+=a;
  47. }
  48. else tmp-=a;
  49. //tmpが,mark[i]から1bitだけ変化したもの
  50. a*=2;
  51. k=tmp;
  52. if(upper_bound(v[k].begin(),v[k].end(),i)!=v[k].end()){
  53. int it=*upper_bound(v[k].begin(),v[k].end(),i);
  54. dp[it]=min(dp[it],dp[i]+1);
  55. }
  56. }
  57. //cout<<dp[i]<<" ";
  58. }
  59. cout<<max(1,dp[s.size()])<<endl;
  60. return 0;
  61. }

unordered_mapを使うと速い(mapと交換したらTLEが取れた)

時間ギリギリ(117:57 / 120:00)