/*
void Del(char* str)
{
bool f=Search(str);
if (f == false) return;
else
{
Trie *p=root;
int len=strlen(str);
for (int i=0;i<len;i++)
{
int id=str[i]-‘a’;
p=p->next[id];
p->vis=false;
}
}
}*/
void Del(char* str)
{
int cnt=Search(str);
if (cnt == 0) return;
else
{
Trie *p=root;
int len=strlen(str);
for (int i=0;i<len;i++)
{
int id=str[i]-‘a’;
p=p->next[id];
p->vis-=cnt;
}
for (int i=0;i<26;i++) p->next[i]=NULL;
}
}
int main()
{
int t;
scanf(“%d”,&t);
// getchar();
root=CreateNode();
while (t–)
{
char str1[7],str2[45];
scanf(“%s%s”,str1,str2);
switch(str1[0])
{
case ‘i’:
Insert(str2);
break;
case ‘s’:
printf(“%s\n”,Search(str2)>0?“Yes”:“No”);
break;
case ‘d’:
Del(str2);
}
}
return 0;
}
1004、
分析:先标准化,都让字符串从小到大排序,这样考虑的情况就减少了很多,开始我的想法用map容器处理,TLE。。。无语,不知道为什么最近用map总是超时闹bug。。。郁闷;之后换个方向思考,字典树(具体可以见我前面的博客),裸的字典树,只需处理插入查找便可
#include
#include
#include
#include
#include
#include
using namespace std;
struct TrieNode
{
bool vis;
struct TrieNode *next[26];
int id;
};
typedef TrieNode Trie;
Trie *root;
Trie *CreateNode()
{
Trie p=(Trie)malloc(sizeof(Trie));
p->vis=false;
p->id=0;
for (int i=0;i<26;i++)
p->next[i]=NULL;
return p;
}
void Insert(string str)
{
Trie *p=root;
int len=str.size();
for (int i=0;i<len;i++)
{
str[i]=tolower(str[i]);
int id=str[i]-‘a’;
if (p->next[id] == NULL)
{
p->next[id]=CreateNode();
p=p->next[id];
}
else p=p->next[id];
}
p->id=1;
p->vis=true;
}
int Search(string str)
{
Trie *p=root;
int len=str.size();
for (int i=0;i<len;i++)
{
str[i]=tolower(str[i]);
int id=str[i]-‘a’;
p=p->next[id];
if (p == NULL) return 0;
}
if (p->vis == true) {p->id++;return p->id-1;}
else return 0;
}
int main()
{
int t;
scanf(“%d”,&t);
getchar();
root=CreateNode();
for (int i=1;i<=t;i++)
{
string str;
cin>>str;
sort(str.begin(),str.end());
if (i == 1){Insert(str);printf(“0\n”);}
else {
int s=Search(str);
if (!s) {Insert(str);printf(“0\n”);}
else printf(“%d\n”,s);
}
}
return 0;
}
1005、大神代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 3 * 1e6 + 10;
const int MOD = 9973;
const int INF = 0x3f3f3f3f;
struct Node {
char var[20];
int digit, op;
};
Node num[1010][40];
int cnt[1010];
void Solve(char *s, int id) {
int top = 0; cnt[id] = 0; num[id][cnt[id]].op = 0;
int len = strlen(s), mark = 0, sum = 0, sign = 1;
s[len] = ‘,’;
for(int i = 0; i <= len; i++) {
if(s[i] == ‘,’) {
num[id][cnt[id]].digit = sum * sign;
cnt[id]++; top = mark = 0;
num[id][cnt[id]].op = 0;
sum = 0; sign = 1;
}
else if(s[i] == ’ ') {
if(s[i+1] != ’ ') {
if(mark == 1) {
num[id][cnt[id]].var[top] = 0;
}
}
}
else if(s[i] == ‘>’) {
mark = 2;
num[id][cnt[id]].op = 1;
}
else if(s[i] == ‘<’) {
mark = 2;
num[id][cnt[id]].op = 2;
}
else if(s[i] == ‘=’) {
mark = 2;
num[id][cnt[id]].op += 3;
}
else if(s[i] == ‘-’ || (s[i] >= ‘0’ && s[i] <= ‘9’)) {
mark = 3;
if(s[i] == ‘-’) {
sign = -1;
continue;
}
sum = sum * 10 + (s[i] - ‘0’);
}
else {
mark = 1;
num[id][cnt[id]].var[top++] = s[i];
}
}
}
// > 1 < 2 = 3 >= 4 <= 5 == 6
bool Check(int op1, int v1, int op2, int v2) {
if(op1 == 1) {
if(op2 == 2 && v2 <= v1 + 1) {
return false;
}
if(op2 == 5 || op2 == 6) {
if(v2 <= v1) {
return false;
}
}
}
if(op1 == 2) {
if(op2 == 1 && v2 >= v1 + 1) {
return false;
}
if(op2 == 4 || op2 == 6) {
if(v2 >= v1) return false;
}
}
if(op1 == 4) {
if(op2 == 2 && v2 <= v1) {
return false;
}
if(op2 == 5 || op2 == 6) {
if(v2 < v1) {
return false;
}
}
}
if(op1 == 5) {
if(op2 == 1 && v2 >= v1) {
return false;
}
if(op2 == 4 || op2 == 6) {
if(v2 > v1) return false;
}
}
if(op1 == 6) {
if(op2 == 1 && v2 >= v1) {
return false;
}
if(op2 == 2 && v2 <= v1) {
return false;
}
if(op2 == 4 && v2 > v1) {
return false;
}
if(op2 == 5 && v2 < v1) {
return false;
}
if(op2 == 6 && v2 != v1) {
return false;
}
}
return true;
}
bool judge(int x, int y) {
for(int i = 0; i < cnt[x]; i++) {
for(int j = 0; j < cnt[y]; j++) {
if(strcmp(num[x][i].var, num[y][j].var) == 0) {
if(!Check(num[x][i].op, num[x][i].digit, num[y][j].op, num[y][j].digit)) {
return false;
}
}
}
}
return true;
}
char str[101000];
int rec[1010];
bool vis[1010];
int main()
{
int n;
while(scanf(“%d”, &n) != EOF) {
getchar();
for(int i = 1; i <= n; i++) {
gets(str); Solve(str, i);
// for(int j = 0; j < cnt[i]; j++) {
// printf(“%s %d %d\n”, num[i][j].var, num[i][j].op, num[i][j].digit);
// }
vis[i] = judge(i, i);
if(vis[i] == false) {
printf(“unique\n”);
continue;
}
int m = 0; bool flag = false;
for(int j = 1; j < i; j++) {
if(vis[j] == false) continue;
if(judge(i, j)) {
rec[++m] = j;
flag = true;
}
}
if(!flag) {
printf(“unique\n”);
}
else {
for(int j = 1; j <= m; j++) {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
e\n");
}
else {
for(int j = 1; j <= m; j++) {
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-fhuvsBsc-1715312001552)]
[外链图片转存中…(img-JfglpXB0-1715312001553)]
[外链图片转存中…(img-NQmBvwQr-1715312001554)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!