Sonya and Matrix Beauty Codeforces - 1080E

https://codeforces.com/contest/1080/problem/E

比赛时候一个多小时码不出来。。。

来看遇到的困难:

1.没有能用的随机unsignedlonglong函数

来一个可以A题的:

ull splitmix64(ull x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
}
ull rd()
{
    static ull x=splitmix64(chrono::steady_clock::now().time_since_epoch().count());
    return splitmix64(x=x*6364136223846793005ull+1442695040888963407ull);
}

2.不会马拉车

以后学。。以下代码的马拉车(calc函数)是网上找的

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<vector>
  5 #include<chrono>
  6 #include<cstdlib>
  7 using namespace std;
  8 #define fi first
  9 #define se second
 10 #define mp make_pair
 11 #define pb push_back
 12 typedef long long ll;
 13 typedef unsigned long long ull;
 14 typedef pair<int,int> pii;
 15 
 16 ull cpy[10001];
 17 int rad[10001];
 18 
 19 ull splitmix64(ull x) {
 20     x += 0x9e3779b97f4a7c15;
 21     x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
 22     x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
 23     return x ^ (x >> 31);
 24 }
 25 ull rd()
 26 {
 27     static ull x=splitmix64(chrono::steady_clock::now().time_since_epoch().count());
 28     return splitmix64(x=x*6364136223846793005ull+1442695040888963407ull);
 29 }
 30 
 31 void manacher(ull str[], int rad[], int len) {
 32     for (int i=1,j=0,k; i < len; i+=k,j-=k) {
 33         while (str[i-j-1] == str[i+j+1]) ++j;
 34         rad[i] = j;
 35         for (k=1; k<=j && rad[i-k]!=rad[i]-k; ++k) {
 36             rad[i+k] = min(rad[i-k], rad[i]-k);
 37         }
 38     }
 39 }
 40 
 41 ll calc(const ull *seq,int len)
 42 {
 43     //for(int i=0;i<len;++i)
 44     //    printf("1t%llu\n",seq[i]);
 45     ull t1,t2,t3;
 46     while(1)
 47     {
 48         t1=rd();t2=rd();t3=rd();
 49         if(t1==t2||t1==t3||t2==t3)    continue;
 50         for(int i=0;i<len;++i)
 51             if(t1==seq[i]||t2==seq[i]||t3==seq[i])
 52                 continue;
 53         break;
 54     }
 55     cpy[0] = t1, cpy[1] = t2;
 56     for (int i=2,j=0; j < len; i+=2,++j) {
 57         cpy[i] = seq[j];
 58         cpy[i+1] = t2;
 59     }
 60     len = len*2+3;
 61     cpy[len-1] = t3;
 62     manacher(cpy, rad, len);
 63     ll ret = 0;
 64     for (int i = 2; i < len-2; ++i) {
 65         ret += (rad[i]+1) / 2;
 66     }
 67     //printf("2t%lld\n",ret);
 68     return ret;
 69 }
 70 
 71 ull bs,bss[]={2477,5227,2503,2521,2531,2539};
 72 ull pwx[101];
 73 ull st[1010];int tp;
 74 struct CharSet
 75 {
 76     int num[26],odd;
 77     ull hs;
 78     void add(int c)
 79     {
 80         ++num[c];
 81         odd^=(1<<c);
 82         hs+=pwx[c];
 83     }
 84     void del(int c)
 85     {
 86         --num[c];
 87         odd^=(1<<c);
 88         hs-=pwx[c];
 89     }
 90     void clear()
 91     {
 92         memset(num,0,sizeof(num));
 93         odd=0;
 94         hs=0;
 95     }
 96 }cs[255];
 97 ll ans;
 98 bool ok[260];
 99 int n,m;
100 int to[260];
101 char s[260][260];
102 int main()
103 {
104     int i,j,l,r;
105     bs=bss[rd()%6];
106     //printf("1t%llu\n",bs);
107     pwx[0]=1;
108     for(i=1;i<=100;++i)
109         pwx[i]=pwx[i-1]*bs;
110     //n=250;m=250;
111     scanf("%d%d",&n,&m);
112     for(i=1;i<=n;++i)
113     {
114         scanf("%s",s[i]+1);
115         //for(j=1;j<=m;++j)
116         //    s[i][j]=rand()%3+'a';
117     }
118     for(l=1;l<=m;++l)
119     {
120         for(i=1;i<=n;++i)
121             cs[i].clear();
122         for(r=l;r<=m;++r)
123         {
124             for(i=1;i<=n;++i)
125                 cs[i].add(s[i][r]-'a');
126             if((r-l+1)&1)
127             {
128                 for(i=1;i<=n;++i)
129                 {
130                     to[i]=__builtin_ffs(cs[i].odd)-1;
131                     cs[i].del(to[i]);
132                 }
133             }
134             for(i=1;i<=n;++i)
135                 ok[i]=!cs[i].odd;
136             if((r-l+1)&1)
137             {
138                 for(i=1;i<=n;++i)
139                     cs[i].add(to[i]);
140             }
141             //printf("3t%d %d\n",l,r);
142             //for(i=1;i<=n;++i)
143             //    printf("4t%llu\n",cs[i].hs);
144             for(i=1;i<=n;++i)
145                 if(ok[i])
146                 {
147                     tp=0;
148                     j=i;st[++tp]=cs[i].hs;
149                     while(j+1<=n&&ok[j+1])
150                     {
151                         ++j;
152                         st[++tp]=cs[j].hs;
153                     }
154                     ans+=calc(st+1,tp);
155                     i=j;
156                 }
157                 //printf("5t%lld\n",ans);
158         }
159     }
160     printf("%lld\n",ans);
161     return 0;
162 }
View Code

 

posted @ 2018-11-25 17:27  hehe_54321  阅读(611)  评论(0编辑  收藏  举报
AmazingCounters.com