Untitled
unknown
plain_text
2 years ago
4.5 kB
16
Indexable
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
struct Node{
char data;
Node* prev;
Node* next;
} pool[30000];
int idx;
Node* getNode(){
return &pool[++idx];
}
void connect(Node* a, Node* b){
a->next=b;
b->prev=a;
}
class Linklist{
public:
Node* head;
Node* tail;
void init(){
head=new Node();
tail=new Node();
connect(head, tail);
}
void addChar(Node *a){
Node* temp= tail->prev;
connect(temp, a);
connect(a, tail);
}
void addCharRV(Node *a){
Node* temp= head->next;
connect(head, a);
connect(a, temp);
}
void del(int K){
for(int i=0;i<K;i++){
Node* temp=tail->prev->prev;
connect(temp, tail);
}
}
void delRV(int K){
for(int i=0;i<K;i++){
Node* temp=head->next->next;
connect(head, temp);
}
}
} ll;
string s;
unordered_map<string, int> mh;
int rv;
void init(char mStr[])
{
rv=0;
ll.init();
mh.clear();
idx=0;
string s=mStr;
int len=s.size();
for(int i=0;i<len-3;i++){
Node* a=getNode();
a->data=s[i];
ll.addChar(a);
string s1="";
for(int j=0;j<4;j++){
s1+=s[i+j];
mh[s1]++;
}
}
Node* a=getNode();
a->data=s[len-3];
ll.addChar(a);
string s2="";
for(int j=0;j<3;j++){
s2+=s[len-2+j];
mh[s2]++;
}
Node *b=getNode();
b->data=s[len-2];
ll.addChar(a);
string s3="";
}
void appendWord(char mWord[])
{
string s=mWord;
int len=s.size();
if(rv==0){
for(int i=0;i<len;i++){
Node* a= getNode();
a->data=s[i];
cc[getIndex(s[i])].push_back(a);
ll.addChar(a);
}
}
else{
for(int i=0;i<len;i++){
Node* a= getNode();
a->data=s[i];
cc[getIndex(s[i])].push_backRV(a);
ll.addCharRV(a);
}
}
}
void cut(int k)
{
if(rv==0) ll.del(k);
else ll.delRV(k);
}
void reverse()
{
rv=1-rv;
}
int countOccurrence(char mWord[])
{
string s=mWord;
int len=s.size();
int count=0;
if(rv==0){
Node* cur=cc[getIndex(mWord[0])].headC->nextC;
while(cur!= cc[getIndex(mWord[0])].tailC){
bool check=true;
Node* cur1=cur;
for(int i=0;i<len;i++){
if(cur1->data!=s[i]){
check=false;
break;
}
cur1=cur1->next;
}
if(check==true) count++;
cur=cur->nextC;
}
}
else{
Node* cur=cc[getIndex(mWord[0])].tailC->prevC;
while(cur!= cc[getIndex(mWord[0])].headC){
bool check=true;
Node* cur1=cur;
for(int i=0;i<len;i++){
if(cur1->data!=s[i]){
check=false;
break;
}
cur1=cur1->prev;
}
if(check==true) count++;
cur=cur->prevC;
}
}
return count;
}
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#define CMD_INIT 1
#define CMD_APPEND 2
#define CMD_CUT 3
#define CMD_REVERSE 4
#define CMD_COUNT 5
extern void init(char mStr[]);
extern void appendWord(char mWord[]);
extern void cut(int k);
extern void reverse();
extern int countOccurrence(char mWord[]);
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
static bool run()
{
bool correct = false;
int queryCnt;
scanf("%d", &queryCnt);
static char mStr[30001], mWord[5];
while (queryCnt--)
{
int cmd;
scanf("%d", &cmd);
if (cmd == CMD_INIT)
{
scanf("%s", mStr);
init(mStr);
correct = true;
}
else if (cmd == CMD_APPEND)
{
scanf("%s", mWord);
if (correct)
{
appendWord(mWord);
}
}
else if (cmd == CMD_CUT)
{
int k;
scanf("%d", &k);
if (correct)
{
cut(k);
}
}
else if (cmd == CMD_REVERSE)
{
if (correct)
{
reverse();
}
}
else if (cmd == CMD_COUNT)
{
scanf("%s", mWord);
int ret = -1;
if (correct)
{
ret = countOccurrence(mWord);
//printf("%d\n", ret);
}
int ans;
scanf("%d", &ans);
if(ret != ans)
{
correct = false;
}
}
}
return correct;
}
int main()
{
setbuf(stdout, NULL);
freopen("sample_input.txt", "r", stdin);
int T, MARK;
scanf("%d %d", &T, &MARK);
for (int tc = 1; tc <= T; tc++)
{
int score = run() ? MARK : 0;
printf("#%d %d\n", tc, score);
}
return 0;
}
25 100
21
1 helloworld
5 o 2
5 owo 1
5 dh 0
5 hell 1
4
5 hell 0
5 owo 1
3 2
5 e 0
2 olol
5 lol 2
4
5 low 1
3 3
5 or 0
2 oooo
5 o 8
5 oo 4
5 ooo 3
5 oooo 2
Editor is loading...