Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //============================================================================
- // Name : Lowest Common Ancestor(logN)
- // Author : Tarango Khan
- // Team : BRACU Byteheads
- //============================================================================
- #include <bits/stdc++.h>
- using namespace std;
- #define Size 1000005
- int len;
- char s[Size];
- int mem[Size][26];
- int A[26];
- int GCD(int a,int b){
- if(b == 0) return a;
- return GCD(b,a%b);
- }
- void preCalc(){
- int pos;
- for(int i = 1;i<=len;i++){
- pos = i-1;
- int idx = (int)(s[pos]-'a');
- for(int j = 0;j<26;j++){
- mem[i][j] = mem[i-1][j];
- }
- mem[i][idx]++;
- }
- }
- bool isPalin(int i,int j){
- int odd = 0;
- for(int c = 0;c<26;c++){
- A[c] = mem[j][c]-mem[i-1][c];
- if(A[c] % 2 != 0) odd++;
- }
- if(odd <= 1) return true;
- return false;
- }
- void solve(){
- int res = 0,dwn = len*(len+1)/2;
- for(int i = 1;i<=len;i++){
- for(int j = i+1;j<=len;j++){
- if(isPalin(i,j) == true) res++;
- }
- }
- printf("res: %d\n",res);
- int gcd = GCD(res,dwn);
- res /= gcd;
- dwn /= gcd;
- printf("%d/%d\n",res,dwn);
- }
- int main(){
- int nCase;
- scanf("%d",&nCase);
- for(int cs = 1;cs<=nCase;cs++){
- scanf("%s",s);
- len = strlen(s);
- for(int i = 0;i<=len;i++){
- for(int j = 0;j<26;j++){
- mem[i][j] = 0;
- }
- }
- preCalc();
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment