想必题意已经很清楚了,通过看题解学习到了一个小技巧,就是x^1,(0^1=1,1^1=0;2^1=3,3^1=2...以此类推)
首先先建立一个用来存放地址的哈希表(我取名为space),一个用来存放魔咒的数组(我的程序里取名叫Hash,不太符合其意思),还有一个头指针。
先将输入的字符串实数化,查地址表若该地址为空就直接往存储数组里塞东西,否则往后拉链表。能够保证碰撞时也可以顺着链表往后找到目标。
有意思的是百度第一页上看到的题解很多都是错的。。。。字符串读取有问题
下面代码:
#include
#include
#include
using namespace std;
const int mod = 1e6+7;
const int inf = 0x3f3f3f3f;
const int base = 131;
const int maxn = 3e6+10;
struct unit{
char save[84];
unit *next;
}Hash[maxn],*space[mod],*point;
int makeId(char *s,int len){
int i,sum=0;
for(i=0;isave, s);
point->next = space[id];
space[id] = point++;
}
int findCurse(char *s,int len){
int id = makeId(s,len);
unit *p = space[id];
while(p){
if(!strcmp(p->save, s)){
return p - Hash;
}else{
p = p->next;
}
}
return -1;
}
char s[110],s1[24],s2[84];
int main(){
point = Hash;
int i,j,len,p,n;
while(gets(s)!=NULL){
if(s[0]=='@'){
break;
}
len = strlen(s);
p=1;
while(p