北極集訓DAY6
阿新 • • 發佈:2017-10-11
ctype clear += 有一個 bcb sca argv lap sin
1 /* 2 sort排序 漏了一個條件只有70 我真是 zz 3 對於一個合法的序列 拿走一個數插入數列中 4 造成的影響就是一些數向前移動 還有數向後移動 5 不管怎麽動 向後移動或向前移動的數一定只有一個 6 後者都不動 7 */ 8 #include <algorithm> 9 #include <cctype> 10 #include <cstdio> 11 #define N 10005000 12 int n, cnt1, cnt2, sum; 13 struct代碼node 14 { 15 int num, pos; 16 bool operator < (node a)const 17 { 18 if(num==a.num) return pos<a.pos; 19 return num<a.num; 20 } 21 }a[N]; 22 int main(int argc, char *argv[]) 23 { 24 //freopen("sort.in", "r", stdin); 25 //freopen("sort.out", "w", stdout);26 scanf("%d", &n); 27 for (int i = 1; i <= n; ++i) scanf("%d", &a[i].num), a[i].pos=i; 28 std :: sort(a + 1, a + n + 1); 29 for (int i = 1; i <= n; ++i) 30 { 31 if (a[i].pos > i) cnt1++; 32 if (a[i].pos < i) cnt2++; 33 } 34 if(cnt1 == 1 || cnt2 == 1 || (!cnt2 && !cnt1)) puts("YES"); 35 else puts("NO"); 36 return 0; 37 //fclose(stdin); fclose(stdout); 38 }
1 /* 2 一個模板吧 。 3 對於60%的數據ai互質 顯然可以用CRT來求解 4 但是後40%ai不互素 CRT求解顯然不對 5 這用了另一種方法 合並多項式 6 即把4個式子利用exgcd合並成1個式子 7 即可求得ans 8 */ 9 #include<iostream> 10 #include<cstdio> 11 typedef long long LL; 12 using namespace std; 13 14 LL n,m[5],a[5]; 15 LL exgcd(LL a,LL b,LL &x,LL &y) 16 { 17 if (b == 0) 18 { 19 x = 1, y = 0; 20 return a; 21 } 22 LL r = exgcd(b, a % b, x, y); 23 LL tmp = x; 24 x = y; 25 y = tmp - a / b * y; 26 return r; 27 } 28 inline LL crt() 29 { 30 LL a1 = a[1], a2, m2, d, c, m1=m[1]; 31 for (LL i = 2; i <= 4; ++i) 32 { 33 a2 = a[i], m2 = m[i]; 34 c = a2 - a1; 35 LL x, y; 36 d = exgcd(m1, m2, x, y); 37 x = x * c / d; 38 int mod = m2 / d; 39 x = (mod + x % mod) % mod; 40 a1 += m1 * x; 41 m1 *= mod; 42 } 43 return a1; 44 } 45 int main(int argc, char *argv[]) 46 { 47 freopen("mod.in","r",stdin); 48 freopen("mod.out","w",stdout); 49 for(int i=1;i<=4;i++) cin>>m[i]>>a[i]; 50 cout<<crt()<<endl; 51 return 0; 52 fclose(stdin); fclose(stdout); 53 }代碼
1 /* 2 我們發現回文串是可以二分的 3 比如:bbbabcbaabcba 我們以第1個c為 4 中心,發現回文半徑是3,大於3一定不是回文串。當回文串長度為偶數的時候 5 我們需要特殊處理一下。 6 現在有一個結論:本質不同的回文串個數只有O(N)個 7 本質不同:字符串本身是不同的。 8 每一次處理完回文串,我們要把他的hash值記錄下來。 9 */ 10 #include <cstdio> 11 #include <cstring> 12 #include <algorithm> 13 #include <map> 14 using namespace std; 15 16 typedef unsigned long long ULL; 17 typedef long long LL; 18 19 char s[10005]; 20 ULL h[10005],rh[10005],pw[10005]; 21 int L; 22 23 ULL hs(int l,int r){ 24 return h[r]-h[l-1]*pw[r-l+1]; 25 } 26 27 ULL rhs(int l,int r){ 28 return rh[l] - rh[r+1]*pw[r-l+1]; 29 } 30 31 struct N{ 32 int a[26]; 33 bool ok(){ 34 int b[26]; 35 for(int i=0;i<26;i++) b[i]=a[i]; 36 sort(b,b+26); 37 for(int i=0;i<25;i++){ 38 if(b[i]>0&& b[i] == b[i+1]) return true; 39 } 40 return false; 41 } 42 void clear(){ 43 memset(a,0,sizeof a); 44 } 45 }; 46 47 LL ans=0; 48 map<ULL,LL> num; 49 map<ULL,N> A; 50 void solve_odd(){ 51 for(int i=1;i<=L;i++){ 52 int l = 1,r = min(i,L-i+1)+1; 53 while(r-l>1){ 54 int mid = (l+r)/2; 55 if(hs(i-mid+1,i+mid-1)== rhs(i-mid+1,i+mid-1)) l=mid; 56 else r=mid; 57 } 58 int p=l; 59 int tmp = p; 60 while(tmp>=1&&num.find(hs(i-tmp+1,i+tmp-1))==num.end()) tmp--; 61 LL sum = 0; 62 N st; 63 st.clear(); 64 if(tmp>=1){ 65 sum=num[hs(i-tmp+1,i+tmp-1)]; 66 st = A[hs(i-tmp+1,i+tmp-1)]; 67 } 68 while(tmp<p){ 69 st.a[s[i+tmp]-‘a‘]+= (tmp == 0?1:2); 70 if(st.ok()) sum++; 71 num[hs(i-tmp,i+tmp)] = sum; 72 A[hs(i-tmp,i+tmp)] = st; 73 tmp++; 74 } 75 ans+=sum; 76 } 77 } 78 79 void solve_even() { 80 A.clear(); 81 num.clear(); 82 for(int i=1;i<L;i++){ 83 int l = 1,r = min(i,L-i)+1; 84 while(r-l>1){ 85 int mid = (l+r)/2; 86 if(hs(i-mid+1,i+mid)== rhs(i-mid+1,i+mid)) l=mid; 87 else r=mid; 88 } 89 int p=l; 90 int tmp = p; 91 while(tmp>=1&&num.find(hs(i-tmp+1,i+tmp))==num.end()) tmp--; 92 LL sum = 0; 93 N st; 94 st.clear(); 95 if(tmp>=1){ 96 sum=num[hs(i-tmp+1,i+tmp)]; 97 st = A[hs(i-tmp+1,i+tmp)]; 98 } 99 while(tmp<p){ 100 st.a[s[i+tmp+1]-‘a‘]+= 2; 101 if(st.ok()) sum++; 102 num[hs(i-tmp,i+tmp+1)] = sum; 103 A[hs(i-tmp,i+tmp+1)] = st; 104 tmp++; 105 } 106 ans+=sum; 107 } 108 } 109 110 int main(){ 111 freopen("str.in","r",stdin); 112 freopen("str.out","w",stdout); 113 scanf("%s",s+1); 114 L=strlen(s+1); 115 s[0]=‘#‘; 116 pw[0]=1; 117 for(int i=1;i<=L;i++) pw[i] = pw[i-1]*13131 ; 118 for(int i=1;i<=L;i++) h[i] = h[i-1]*13131 + s[i]; 119 for(int i=L;i>=1;i--) rh[i] = rh[i+1]*13131 + s[i]; 120 solve_odd(); 121 solve_even(); 122 printf("%lld\n",ans); 123 fclose(stdout); 124 return 0; 125 }代碼
北極集訓DAY6