UVA 6284 [상태 접두사 가 다 르 거나 + hash]

제목: 하나의 문자열 을 주 고 몇 개의 구간 이 회 문 열 을 구성 할 수 있 는 지 물 어보 세 요.구성 요 구 는 모든 종류의 문자 수량 이 같 거나 한 가지 만 존재 하 는 개 수 를 만족 시 키 면 홀수 이다.사고: 문자 가 비교적 적 기 때문에 252 상 압 을 고려 하면 롱 롱 롱 은 먹 을 수 있 습 니 다.그리고 계속 가입 해서 이 상태 가 만족 하 는 지 확인 하 세 요.
우 리 는 상태 (단순히 4 위 를 고려) 를 볼 수 있다.
1. 10 어떻게 그 에 게 서 몇 가지 상 태 를 잘라 만족 시 키 는 지 볼 수 있 습 니 다. 1000 이 있 습 니 다. 그 렇 죠? 그리고 0. 01. 0. 0. 0. 0. 0. 0. 0. 0 1. 우 리 는 a. ^ b = c 를 알 고 있 습 니 다. 그러면 a. ^ c = b.그러면 우 리 는 현재 상태 혹은 만족 하 는 상 태 를 가 져 가면 되 잖 아 요. '자 를 상태' 가 현재 얼마나 되 는 지 알 아 보 세 요.
그리고 여기 힘 들 어 요. 손 으로 hash 를 써 야 돼 요. 맵 이 시간 을 초과 해 요.
그리고 주의: (1 < < j) int 가 터 지면 (1 * LL * * < j)
#include 
using namespace std;
typedef long long LL;

const LL mod = 1e6+7;
const int N=3e5+10;
bool vis[55];
char ch[N];
int n;

struct asd{
    LL v, id;
    int nex;
}eg[2000010];
int head[1000007],sizes;

void init(){
    memset(head,-1,sizeof(head));
    sizes = 0;
}

void add(LL a){
    LL pos = a % mod;
    for(int i = head[pos];~i;i = eg[i].nex){
        LL id = eg[i].id;
        if(id == a){
            eg[i].v++;
            return;
        }
    }
    eg[sizes].v = 1;
    eg[sizes].id = a;
    eg[sizes].nex = head[pos];
    head[pos] = sizes++;
    return;
}

LL getv(LL a){
    LL pos = a % mod;
    for(int i=head[pos];~i;i=eg[i].nex){
        LL id = eg[i].id;
        if(id == a) return eg[i].v;
    }
    return 0;
}

long long Getch(char x){
    if(x >= 'a' && x <= 'z') return x-'a';
    return x - 'A' + 26;
}

int main(){
    LL id;
    while(~scanf("%d%s",&n,ch+1)){
        init();
        LL ans = 0;
        LL st = 0;
        add(0);

        for(int i=1;i<=n;i++){
            id = Getch(ch[i]);

            st ^= (1LL<for(LL j = 0;j < 52;j++){
                LL tst = st^(1LL<printf("%lld
"
,ans); } return 0; }

좋은 웹페이지 즐겨찾기