BestCoder Round #88
分析:
A题统计字符串中连续字串全为q的个数,预处理以下或加个cnt就好了;
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <ctime> 5 #include <cmath> 6 #include <iostream> 7 #include <algorithm> 8 #include <string> 9 #include <set> 10 #include <map> 11 #include <queue> 12 #include <stack> 13 #include <vector> 14 #include <bitset> 15 using namespace std; 16 17 #define ll long long 18 #define F(i,a,b) for(int i=a;i<=b;++i) 19 #define R(i,a,b) for(int i=a;i<b;++i) 20 #define Rof(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--) 21 #define rek(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--) 22 #define mem(a,b) memset(a,b,sizeof(a)) 23 #define cpy(a,b) memcpy(a,b,sizeof(b)) 24 #pragma comment(linker, "/STACK:102400000,102400000") 25 inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}} 26 char s[100100]; 27 int t,cnt; 28 ll sum; 29 int main() 30 { 31 for(scanf("%d",&t);t--;) 32 { 33 scanf("%s",s);int len=strlen(s);cnt=sum=0; 34 for(int i=0;i<len;++i) if(s[i]=='q') sum+=cnt,cnt++;else if(cnt) {sum+=cnt;cnt=0;} 35 if(cnt) sum+=cnt; 36 printf("%lld\n",sum); 37 } 38 return 0; 39 }
B题求出一个数字串的所有完全阿贝尔周期;
设S是一个数字串,定义函数occ(S,x)occ(S,x)表示S中数字x的出现次数。
例如:S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1S=(1,2,2,1,3),occ(S,1)=2,occ(S,2)=2,occ(S,3)=1。
如果对于任意的i,都有occ(u,i)=occ(w,i)occ(u,i)=occ(w,i),那么我们认为数字串u和w匹配。
例如:(1,2,2,1,3)\approx(1,3,2,1,2)(1,2,2,1,3)≈(1,3,2,1,2)。
对于一个数字串S和一个正整数k,如果SS可以分成若干个长度为k的连续子串,且这些子串两两匹配,那么我们称k是串S的一个完全阿贝尔周期。
给定一个数字串S,请找出它所有的完全阿贝尔周期
那么对于给定的n,从1-n枚举它的因子比如k,然后判断1-k是否与k+1~2*k,2*k+1~3*k...(t*k<=n)匹配,这里要处理一下,详情见代码
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <ctime> 5 #include <cmath> 6 #include <iostream> 7 #include <algorithm> 8 #include <string> 9 #include <set> 10 #include <map> 11 #include <queue> 12 #include <stack> 13 #include <vector> 14 #include <bitset> 15 using namespace std; 16 17 #define LL long long 18 #define F(i,a,b) for(int i=a;i<=b;++i) 19 #define R(i,a,b) for(int i=a;i<b;++i) 20 #define Rof(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--) 21 #define rek(i,a,b) for (int i=(a),_##i=(b); i>=_##i; i--) 22 #define mem(a,b) memset(a,b,sizeof(a)) 23 #define cpy(a,b) memcpy(a,b,sizeof(b)) 24 #pragma comment(linker, "/STACK:102400000,102400000") 25 inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}} 26 int t,n,cnt,a[100010],b[100010],p[100100],p1[100100]; 27 int main() 28 { 29 for(scanf("%d",&t);t--;) 30 { 31 scanf("%d",&n);cnt=0; 32 F(i,1,n) scanf("%d",a+i); 33 for(int i=1;i*i<=n;++i) if(n%i==0) 34 { 35 for(int i=0;i<=n;++i) p[i]=p1[i]=0; 36 int x=n/i; 37 for(int j=1;j<=i;++j) p[a[j]]++; 38 for(int k=i*2;k<=n;k+=i) 39 { 40 for(int j=k-i+1;j<=k;j++) p1[a[j]]++; 41 for(int j=1;j<=i;++j) if(p[a[j]]*(k/i-1)!=p1[a[j]]) goto l; 42 } 43 b[cnt++]=i;l:; 44 for(int i=0;i<=n;++i) p[i]=p1[i]=0; 45 for(int j=1;j<=x;++j) p[a[j]]++; 46 for(int k=x*2;k<=n;k+=x) 47 { 48 for(int j=k-x+1;j<=k;j++) p1[a[j]]++; 49 for(int j=1;j<=x;++j) if(p[a[j]]*(k/x-1)!=p1[a[j]]) goto l1; 50 } 51 b[cnt++]=x;l1:; 52 } 53 sort(b,b+cnt); 54 printf("%d",b[0]); 55 for(int i=1;i<cnt;++i) if(b[i]!=b[i-1])printf(" %d",b[i]);puts(""); 56 } 57 return 0; 58 }
一直地一直地往前走